开发者

Java Problem using GridLayout

I want to have a 3x3 grid layout struc开发者_开发技巧tured like this:

 _ _ _ _ _ _ _ _ _ _ _ _
|        Label         |
| Button Button Button |
|       TextArea       |
|_ _ _ _ _ _ _ _ _ _ _ |

But the layout is broken.

    public static void main(String[] args){
    JFrame frame = new JFrame("title");
    frame.setSize(400,500);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    GridLayout layout = new GridLayout(3,3);

    JPanel pan0 = new JPanel();
    JPanel pan1 = new JPanel();
    JPanel pan2 = new JPanel();

    pan0.setLayout(layout);
    GridBagConstraints c = new GridBagConstraints();

    JLabel title = new JLabel("title");
    title.setFont(new Font("Serif", Font.BOLD, 40));
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 3;
    pan0.add(title, c);

    JButton b1 = new JButton("button1");
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    pan0.add(b1, c);

    JButton b2 = new JButton("button2");
    c.gridx = 1;
    c.gridy = 2;
    c.gridwidth = 1;
    pan0.add(b2, c);

    JButton b3 = new JButton("button3");
    c.gridx = 2;
    c.gridy = 3;
    c.gridwidth = 1;
    pan0.add(b3, c);    

    TextArea text1 = new TextArea(15,40);
    c.gridx = 2;
    c.gridy = 0;
    c.gridwidth = 3;
    pan0.add(text1, c);

    frame.add(pan0);
    frame.pack();

  }
}


you are using a GridBagConstraint with a GridLayout

instead use a GridBagLayoutit's in the same pakage


To add to ratchet's answer, you also have some grid positions incorrect. Try this

    GridBagLayout layout = new GridBagLayout();

    JPanel pan0 = new JPanel();
    JPanel pan1 = new JPanel();
    JPanel pan2 = new JPanel();

    pan0.setLayout(layout);
    GridBagConstraints c = new GridBagConstraints();

    JLabel title = new JLabel("title");
    title.setFont(new Font("Serif", Font.BOLD, 40));
    c.gridx = 0;
    c.gridy = 0;
    c.gridwidth = 3;
    c.fill = GridBagConstraints.CENTER;
    pan0.add(title, c);

    JButton b1 = new JButton("button1");
    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    pan0.add(b1, c);

    JButton b2 = new JButton("button2");
    c.gridx = 1;
    c.gridy = 1;
    c.gridwidth = 1;
    pan0.add(b2, c);

    JButton b3 = new JButton("button3");
    c.gridx = 2;
    c.gridy = 1;
    c.gridwidth = 1;
    pan0.add(b3, c);    

    TextArea text1 = new TextArea(15,40);
    c.gridx = 0;
    c.gridy = 2;
    c.gridwidth = 3;
    c.fill = GridBagConstraints.CENTER;
    pan0.add(text1, c);


You're confusing GridLayout with GridBagLayout, but I'd use a BoxLayout for the vertical positioning myself, and then perhaps a GridLayout for the buttons. For e.g.,

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;

public class Foo003 {
   private static final int BTN_COUNT = 3;
   private static final int VERT_GAP = 10;
   private static final int EB_GAP = 5;
   private static final float TITLE_SIZE = 36f;
   private static final String TITLE_TEXT = "This is my Title";

   private static void createAndShowUI() {

      JLabel titleLabel = new JLabel(TITLE_TEXT, SwingConstants.CENTER);
      titleLabel.setFont(titleLabel.getFont().deriveFont(TITLE_SIZE));
      JPanel titlePanel = new JPanel();
      titlePanel.add(titleLabel);

      JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));
      for (int i = 0; i < BTN_COUNT; i++) {
         JButton btn = new JButton("Button " + (i + 1));
         buttonPanel.add(btn);
      }

      JTextArea textArea = new JTextArea(20, 30);

      JPanel mainPanel = new JPanel();
      mainPanel.setBorder(BorderFactory.createEmptyBorder(EB_GAP, EB_GAP, EB_GAP, EB_GAP));
      mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
      mainPanel.add(titlePanel);
      mainPanel.add(Box.createVerticalStrut(VERT_GAP));
      mainPanel.add(buttonPanel);
      mainPanel.add(Box.createVerticalStrut(VERT_GAP));
      mainPanel.add(new JScrollPane(textArea));

      JFrame frame = new JFrame("Foo003");
      frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜