Java Tutorial/Swing/FlowLayout
Содержание
- 1 Changing the Gap
- 2 Demonstrates how to fix common alignment problems
- 3 FlowLayout Behavior
- 4 FlowLayout: the default layout manager for a JPanel.
- 5 Laying Out Components in a Flow (Left-to-Right, Top-to-Bottom)
- 6 Layout manager
- 7 Setting the gaps between components and rows explicitly by calling the setHgap()
- 8 Three constructors available for the FlowLayout manager.
- 9 Use FlowLayout to hold checkBox, Label and TextField
- 10 Using FlowLayout
Changing the Gap
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class FlowLayoutChangingGap {
public static void main(String[] args) {
JFrame aWindow = new JFrame("This is a Flow Layout");
aWindow.setBounds(50,50,500,500);
aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout flow = new FlowLayout(FlowLayout.LEFT, 20, 30);
Container content = aWindow.getContentPane(); // Get the content pane
content.setLayout(flow); // Set the container layout mgr
for (int i = 1; i <= 6; i++){
content.add(new JButton("Press " + i)); // Add a Button to content pane
}
aWindow.setVisible(true); // Display the window
}
}
Demonstrates how to fix common alignment problems
/*
*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
public class BoxAlignmentDemo extends JPanel {
public BoxAlignmentDemo() {
super(new BorderLayout());
JTabbedPane tabbedPane = new JTabbedPane();
JPanel buttonRow = new JPanel();
// Use default FlowLayout.
buttonRow.add(createButtonRow(false));
buttonRow.add(createButtonRow(true));
tabbedPane.addTab("Altering alignments", buttonRow);
JPanel labelAndComponent = new JPanel();
// Use default FlowLayout.
labelAndComponent.add(createLabelAndComponent(false));
labelAndComponent.add(createLabelAndComponent(true));
tabbedPane.addTab("X alignment mismatch", labelAndComponent);
JPanel buttonAndComponent = new JPanel();
// Use default FlowLayout.
buttonAndComponent.add(createYAlignmentExample(false));
buttonAndComponent.add(createYAlignmentExample(true));
tabbedPane.addTab("Y alignment mismatch", buttonAndComponent);
// Add tabbedPane to this panel.
add(tabbedPane, BorderLayout.CENTER);
}
protected JPanel createButtonRow(boolean changeAlignment) {
JButton button1 = new JButton("A JButton", createImageIcon("images/middle.gif"));
button1.setVerticalTextPosition(AbstractButton.BOTTOM);
button1.setHorizontalTextPosition(AbstractButton.CENTER);
JButton button2 = new JButton("Another JButton", createImageIcon("images/geek-cght.gif"));
button2.setVerticalTextPosition(AbstractButton.BOTTOM);
button2.setHorizontalTextPosition(AbstractButton.CENTER);
String title;
if (changeAlignment) {
title = "Desired";
button1.setAlignmentY(BOTTOM_ALIGNMENT);
button2.setAlignmentY(BOTTOM_ALIGNMENT);
} else {
title = "Default";
}
JPanel pane = new JPanel();
pane.setBorder(BorderFactory.createTitledBorder(title));
pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));
pane.add(button1);
pane.add(button2);
return pane;
}
protected JPanel createLabelAndComponent(boolean doItRight) {
JPanel pane = new JPanel();
JComponent component = new JPanel();
Dimension size = new Dimension(150, 100);
component.setMaximumSize(size);
component.setPreferredSize(size);
component.setMinimumSize(size);
TitledBorder border = new TitledBorder(new LineBorder(Color.black), "A JPanel",
TitledBorder.CENTER, TitledBorder.BELOW_TOP);
border.setTitleColor(Color.black);
component.setBorder(border);
JLabel label = new JLabel("This is a JLabel");
String title;
if (doItRight) {
title = "Matched";
label.setAlignmentX(CENTER_ALIGNMENT);
} else {
title = "Mismatched";
}
pane.setBorder(BorderFactory.createTitledBorder(title));
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
pane.add(label);
pane.add(component);
return pane;
}
protected JPanel createYAlignmentExample(boolean doItRight) {
JPanel pane = new JPanel();
String title;
JComponent component1 = new JPanel();
Dimension size = new Dimension(100, 50);
component1.setMaximumSize(size);
component1.setPreferredSize(size);
component1.setMinimumSize(size);
TitledBorder border = new TitledBorder(new LineBorder(Color.black), "A JPanel",
TitledBorder.CENTER, TitledBorder.BELOW_TOP);
border.setTitleColor(Color.black);
component1.setBorder(border);
JComponent component2 = new JPanel();
size = new Dimension(100, 50);
component2.setMaximumSize(size);
component2.setPreferredSize(size);
component2.setMinimumSize(size);
border = new TitledBorder(new LineBorder(Color.black), "A JPanel", TitledBorder.CENTER,
TitledBorder.BELOW_TOP);
border.setTitleColor(Color.black);
component2.setBorder(border);
if (doItRight) {
title = "Matched";
} else {
component1.setAlignmentY(TOP_ALIGNMENT);
title = "Mismatched";
}
pane.setBorder(BorderFactory.createTitledBorder(title));
pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));
pane.add(component1);
pane.add(component2);
return pane;
}
/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = BoxAlignmentDemo.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn"t find file: " + path);
return null;
}
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("BoxAlignmentDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
BoxAlignmentDemo newContentPane = new BoxAlignmentDemo();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
FlowLayout Behavior
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class FlowLayoutBehaviour extends JFrame {
public static void main(String[] args) {
FlowLayoutBehaviour ft = new FlowLayoutBehaviour();
ft.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ft.setSize(400, 300);
ft.setVisible(true);
}
public FlowLayoutBehaviour() {
super();
Container pane = getContentPane();
pane.setLayout(new FlowLayout(FlowLayout.LEFT));
pane.add(new JLabel("This is a test"));
pane.add(new JButton("of a FlowLayout"));
pane.add(new JTextField(30));
pane.add(new JTextArea("This is a JTextArea", 3, 10));
pane.add(new JLabel("This is a FlowLayout test with a long string"));
}
}
FlowLayout: the default layout manager for a JPanel.
- A FlowLayout adds components to the container in rows.
- When it can"t fit more components in a row, it starts a new row.
- Components within a FlowLayout-managed container are given their preferred size.
- If there is insufficient space, you do not see all the components.
There are three constructors for creating the FlowLayout layout manager:
public FlowLayout()
public FlowLayout(int alignment)
public FlowLayout(int alignment, int hgap, int vgap)
Laying Out Components in a Flow (Left-to-Right, Top-to-Bottom)
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Main {
public static void main(String[] argv) throws Exception {
JButton component1 = new JButton();
JButton component2 = new JButton();
int align = FlowLayout.CENTER; // or LEFT, RIGHT
JPanel panel = new JPanel(new FlowLayout(align));
panel.add(component1);
panel.add(component2);
}
}
Layout manager
That layout manager is responsible for positioning components, regardless of the platform or screen size.
To find out how much space a component needs, the layout manager calls the component"s getMinimumSize(), getPreferredSize(), and getMaximumSize() methods.
The AWT layout managers are
- FlowLayout,
- BorderLayout,
- GridLayout,
- CardLayout, and
- GridBagLayout.
The Swing layouts are
- BoxLayout,
- OverlayLayout,
- ScrollPaneLayout,
- ViewportLayout, and
- SpringLayout.
Setting the gaps between components and rows explicitly by calling the setHgap()
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class FlowLayoutSettingGaps {
public static void main(String[] args) {
JFrame aWindow = new JFrame("This is a Flow Layout");
aWindow.setBounds(30, 30, 300, 300); // Size
aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout flow = new FlowLayout(); // Create a layout manager
flow.setHgap(35); // Set the horizontal gap
Container content = aWindow.getContentPane(); // Get the content pane
content.setLayout(flow); // Set the container layout mgr
// Now add six button components
for (int i = 1; i <= 6; i++) {
content.add(new JButton("Press " + i)); // Add a Button to content pane
}
aWindow.setVisible(true); // Display the window
}
}
Three constructors available for the FlowLayout manager.
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class FlowLayoutExample {
public static void main(String[] args) {
JPanel panel = new JPanel();
JTextArea area = new JTextArea("text area");
area.setPreferredSize(new Dimension(100, 100));
JButton button = new JButton("button");
panel.add(button);
panel.add(new JScrollPane(area));
JFrame f = new JFrame();
f.add(panel);
f.pack();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
Use FlowLayout to hold checkBox, Label and TextField
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.List;
import java.awt.TextField;
public class Main {
public static void main(String[] args) {
Frame f = new Frame("FlowLayout demo");
f.setLayout(new FlowLayout());
f.add(new Button("Red"));
f.add(new Button("Blue"));
f.add(new Button("White"));
List list = new List();
for (int i = 0; i < args.length; i++) {
list.add(args[i]);
}
f.add(list);
f.add(new Checkbox("Pick me", true));
f.add(new Label("Enter name here:"));
f.add(new TextField(20));
f.pack();
f.setVisible(true);
}
}
Using FlowLayout
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class FlowLayoutTest {
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("FlowLayout Test");
frame.setLayout(new FlowLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String text = "A JTextArea object represents" + "a multiline area for displaying text."
+ "You can change the number of lines" + "that can be displayed at a time.";
JTextArea textArea1 = new JTextArea(text, 5, 10);
textArea1.setPreferredSize(new Dimension(100, 100));
JTextArea textArea2 = new JTextArea(text, 5, 10);
textArea2.setPreferredSize(new Dimension(100, 100));
JScrollPane scrollPane = new JScrollPane(textArea2, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
textArea1.setLineWrap(true);
textArea2.setLineWrap(true);
frame.add(textArea1);
frame.add(scrollPane);
frame.pack();
frame.setVisible(true);
}
}