Java Tutorial/Swing/FlowLayout

Материал из Java эксперт
Перейти к: навигация, поиск

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.

  1. A FlowLayout adds components to the container in rows.
  2. When it can"t fit more components in a row, it starts a new row.
  3. Components within a FlowLayout-managed container are given their preferred size.
  4. 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

  1. FlowLayout,
  2. BorderLayout,
  3. GridLayout,
  4. CardLayout, and
  5. GridBagLayout.

The Swing layouts are

  1. BoxLayout,
  2. OverlayLayout,
  3. ScrollPaneLayout,
  4. ViewportLayout, and
  5. 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);
  }
}