【问题标题】:positionnig myJTextField beside JComboBoxpositionnig myJTextField 在 JComboBox 旁边
【发布时间】:2015-11-13 20:44:30
【问题描述】:

我想创建一个带有许多 JComboBox 的调色板。像这样:

for(int x=0; x<MAX; x++){
    box[x] = new JComboBox(new String[]{"op1", "op2", "op3");
}

在每个 JComboBox 的右侧,我想创建许多 JTextField。所以,在我的调色板中,我会有一些这样的想法:

myJComboBox1          myJTextField
                      anotherJTextField
                      anotherJTextField



myJComboBox2          myJTextField
                      anotherJTextField
                      anotherJTextField
...

请问我该怎么做?我尝试了setBounds 和其他布局,如FlowLayoutGridLayout,但没有成功。

【问题讨论】:

    标签: java swing jframe jtextfield jcombobox


    【解决方案1】:

    GridBagLayout 是最好的解决方案。但是,如果您是 Swing 新手,它可能有点过于复杂。在这种情况下:

    1. 对主面板使用 GridLayout(0, 2)。
    2. 使用边框布局将组合框包装在面板中,并将其添加到北方。将其添加到主面板。
    3. 将另一个面板与 GridLayout(0,1) 一起使用,将您的文本字段添加到其中并将其添加到主面板。

    然后循环...

    添加示例代码:

    package snippet;
    
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.GridLayout;
    
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class BorderLayoutTest extends JFrame {
    
        static private int MAX = 10 ;
    
        public BorderLayoutTest() {
            super(BorderLayoutTest.class.getName());
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            initComponents();
        }
    
        private void initComponents() {
            setLayout(new GridLayout(0, 2));
            for(int i = 0; i < MAX; i++) {
                add(createComboPanel());
                add(createPanelWithTextFields());
            }
            pack();
        }
    
        public Component createComboPanel() {
            JPanel panel = new JPanel(new BorderLayout());
            panel.add(new JComboBox<>(new String[] { "First Option", "Second Option", "Third Option" }), BorderLayout.NORTH);
            return panel;
        }
    
        private Component createPanelWithTextFields() {
            JPanel panel = new JPanel(new GridLayout(0, 1));
            panel.add(new JTextField(30));
            panel.add(new JTextField(30));
            panel.add(new JTextField(30));
            return panel;
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override public void run() {
                    new BorderLayoutTest().setVisible(true);
                }
            });
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      看看GridBagLayout。您可以像使用表格一样使用窗口。

      myPanel.setLayout(new GridBagLayout());
      
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 0;
      gbc.gridy = 0;
      gbc.weightx = 1;
      
      JLabel lbl = new JLabel("bla");
      myPanel.add(lbl, gbc);
      
      gbc = new GridBagConstraints();
      gbc.gridx = 1;
      gbc.gridy = 0;
      gbc.weightx = 3;
      
      JTextField tf = new JTextField();
      myPanel.add(tf, gbc);
      
      gbc = new GridBagConstraints();
      gbc.gridx = 1;
      gbc.gridy = 1;
      gbc.weightx = 3;
      
      JTextField othertf = new JTextField();
      myPanel.add(othertf, gbc);
      

      您甚至可以为 GridBagConstraints 设置权重等。它被完全调整为桌子。这将导致类似的结果:

      label      textfield
                 textfield
      

      只需重新阅读问题。只需将 JLabels 替换为 JComboBoxes 即可更好地回答您的问题;)

      【讨论】:

      • 仅供参考:通常不鼓励仅链接答案,应使用链接来支持或增强您的答案。考虑提供一个小例子来推动操作朝着正确的方向发展。否则,这只是一条评论
      • 前段时间,我读到类似“快速回答并稍后改进你的答案”之类的东西,所以我就这样尝试了;)
      • 是和否 ;),但这是一种改进。可能需要更长的时间才能生成但提供对问题和解决方案的更广泛解释的答案可能会忽略快速答案
      猜你喜欢
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2018-05-09
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多