【问题标题】:Java Swing UI component Layout issueJava Swing UI 组件布局问题
【发布时间】:2016-04-13 06:49:35
【问题描述】:

我正在研究 java swing,但我被 UI 布局卡住了

我目前的输出如下。标签 6 之后的文本区域正在缩小,下一个面板将出现在它旁边。 我想要的是面板应该在下一行,文本区域应该与组合框的大小相同。

JFrame frame = new JFrame("My Sample Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 800);
frame.setVisible(true);

JPanel jpOPanel = new JPanel();
jpOPanel.setBorder(new CompoundBorder(new TitledBorder("Outer Panel"),
                                      new EmptyBorder(0, 2, 2,
                                                      2)));
GridBagLayout gbl = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
jpOPanel.setLayout(gbl);

JPanel jpSearch = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JButton jbSearch = new JButton("Search");
jpSearch.add(jbSearch);
gbc.weightx = 0.0D;
gbc.weighty = 0.0D;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.fill = 1;
gbc.gridwidth = 0;
gbl.setConstraints(jpSearch, gbc);
jpOPanel.add(jpSearch);

JLabel jlLabel1 = new JLabel("Label 1 :");
gbc.weightx = 0.0D;
gbc.weighty = 0.0D;
gbc.insets = new Insets(0, 0, 5, 5);
gbc.fill = 2;
gbc.gridwidth = -1;
gbl.setConstraints(jlLabel1, gbc);
jpOPanel.add(jlLabel1);

JComboBox jComboBox1 = new JComboBox();
gbc.weightx = 1.0D;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridwidth = 0;
gbl.setConstraints(jComboBox1, gbc);
jComboBox1.setVisible(true);
jpOPanel.add(jComboBox1);

JLabel jlLabel2 = new JLabel("Label 2 :");
gbc.weightx = 0.0D;
gbc.insets = new Insets(0, 0, 5, 5);
gbc.gridwidth = -1;
gbl.setConstraints(jlLabel2, gbc);
jpOPanel.add(jlLabel2);

JComboBox jComboBox2 = new JComboBox();
gbc.weightx = 1.0D;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridwidth = 0;
gbl.setConstraints(jComboBox2, gbc);
jComboBox2.setVisible(true);
jpOPanel.add(jComboBox2);

JLabel jlLabel3 = new JLabel("Label 3 :");
gbc.weightx = 0.0D;
gbc.insets = new Insets(0, 0, 5, 5);
gbc.gridwidth = -1;
gbl.setConstraints(jlLabel3, gbc);
jpOPanel.add(jlLabel3);

JComboBox jComboBox3 = new JComboBox();
gbc.weightx = 1.0D;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridwidth = 0;
gbl.setConstraints(jComboBox3, gbc);
jpOPanel.add(jComboBox3);

JLabel jlLabel4 = new JLabel("Label 4 :");
gbc.weightx = 0.0D;
gbc.insets = new Insets(0, 0, 5, 5);
gbc.gridwidth = -1;
gbl.setConstraints(jlLabel4, gbc);
jpOPanel.add(jlLabel4);

JTextField jTextField1 = new JTextField();
jTextField1.setEditable(false);
gbc.weightx = 1.0D;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridwidth = 0;
gbl.setConstraints(jTextField1, gbc);
jpOPanel.add(jTextField1);

JLabel jlLabel5 = new JLabel("Label 5 :");
gbc.weightx = 0.0D;
gbc.insets = new Insets(0, 0, 5, 5);
gbc.gridwidth = -1;
gbl.setConstraints(jlLabel5, gbc);
jpOPanel.add(jlLabel5);

JTextField jTextField2 = new JTextField();
jTextField2.setEditable(false);
gbc.weightx = 1.0D;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridwidth = 0;
gbl.setConstraints(jTextField2, gbc);
jpOPanel.add(jTextField2);

JLabel jlLabel6 = new JLabel("Label 6 :");
jlLabel6.setVisible(true);
gbc.weightx = 0.0D;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.gridwidth = 1;
gbl.setConstraints(jlLabel6, gbc);
jpOPanel.add(jlLabel6);

JTextArea jTextArea1 = new JTextArea(3, 35);
jTextArea1.setVisible(true);
jTextArea1.setEditable(false); 
jTextArea1.setLineWrap(true);
int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;

JScrollPane jspane = new JScrollPane(jTextArea1, v, h);
gbc.weightx = 2;
gbc.weighty = 0.0D;
gbc.insets = new Insets(0, 0, 5, 0);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = 0;
gbc.gridheight = 2;
gbl.setConstraints(jTextArea1, gbc);
jpOPanel.add(jspane);
jspane.setVisible(true);

JPanel jInnerPanel = new JPanel();
jInnerPanel.setBorder(new CompoundBorder(new TitledBorder(""), new EmptyBorder(0, 0, 0, 0)));
gbc.weightx = 0.0D;
gbc.weighty = 0.0D;
gbc.insets = new Insets(5, 0, 5, 5);
gbc.fill = 1;
gbc.gridwidth = 0;
gbl.setConstraints(jInnerPanel, gbc);

JCheckBox jCheckBox1 = new JCheckBox("Check here");
jCheckBox1.setPreferredSize(new Dimension(140, 20));
jCheckBox1.setMinimumSize(new Dimension(140, 20));
jCheckBox1.setMaximumSize(new Dimension(140, 20));
gbc.ipady = 0;
gbc.weightx = 0.5D;
gbc.weighty = 0.0D;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.LINE_START;
gbc.insets = new Insets(0, 0, 0, 0);
gbc.gridx = 0;
gbc.gridy = 0;
gbl.setConstraints(jCheckBox1, gbc);
jInnerPanel.add(jCheckBox1);


JLabel jlLabel7 = new JLabel("Label 7 : ");
jlLabel7.setPreferredSize(new Dimension(140, 20));
jlLabel7.setMinimumSize(new Dimension(140, 20));
jlLabel7.setMaximumSize(new Dimension(140, 20));
gbc.ipady = 0;
gbc.weightx = 0.5D;
gbc.weighty = 0.0D;
gbc.anchor = GridBagConstraints.LINE_START;
gbc.insets = new Insets(0, 0, 0, 0);
gbc.gridx = 0;
gbc.gridy = 6;

gbl.setConstraints(jlLabel7, gbc);
jInnerPanel.add(jlLabel7);

JComboBox jComboBox4 = new JComboBox();
jComboBox4.setEnabled(false);
jComboBox4.setPreferredSize(new Dimension(225, 20));
jComboBox4.setMinimumSize(new Dimension(225, 20));
jComboBox4.setMaximumSize(new Dimension(225, 20));
gbc.gridx = 1;
gbc.gridy = 6;
gbc.anchor = GridBagConstraints.LAST_LINE_END;
gbl.setConstraints(jComboBox4, gbc);
jInnerPanel.add(jComboBox4);

jpOPanel.add(jInnerPanel);

frame.add(jpOPanel);

当前显示

预期显示

【问题讨论】:

    标签: java swing jpanel layout-manager gridbaglayout


    【解决方案1】:

    替换行:

     gbl.setConstraints(jTextArea1, gbc);
     jpOPanel.add(jspane);
    

    jspane.setViewportView(jTextArea1);
    jpOPanel.add(jspane, gbc);
    

    您需要将要添加的组件的GridBagConstraints 设置为jpOPanel,在本例中为JScrollPanel

    【讨论】:

    • 非常感谢先生,它成功了。但在我的内部面板中,复选框和其他 2 个组件位于同一行。我想要的是复选框应该在第一行,第二行是标签和复选框。两者都应与内部面板边框对齐。请参考原帖中的图片以供参考
    • @pankti 首先需要将jInnerPanel的布局管理器设置为GridBagLayout,可以通过jInnerPanel.setLayout(new GridBagLayout())来实现。其次,一个好的做法是让每个JComponent 拥有自己的GridBagConstraint。如果您为您的 jCheckBox1jlLabel7jComboBox4 使用正确的 gridxgridy 值这样做,您应该得到您所期望的。
    • 非常感谢 Lekili 先生的宝贵时间和回复。
    • 接受答案的好电话。它可以帮助人们在未来找到有用的信息(例如,当我搜索答案时,我通常会直接跳过任何缺少已接受答案的问题)。 :)
    猜你喜欢
    • 2016-08-26
    • 2014-12-20
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2013-10-12
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多