首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swing布局问题

Swing布局问题
EN

Stack Overflow用户
提问于 2011-08-25 23:12:07
回答 3查看 529关注 0票数 2

我迷失在摆出噩梦的秋千中:(我将暴露我的问题,但我正在寻找建议以及明确的解决方案。

我的问题:我想设计一个这样的表单:

我正在努力处理Netbeans生成的代码:

代码语言:javascript
复制
private void initComponents() {

    buttonGroup1 = new javax.swing.ButtonGroup();
    buttonGroup2 = new javax.swing.ButtonGroup();
    jPanel1 = new javax.swing.JPanel();
    jPanel2 = new javax.swing.JPanel();
    jTextField1 = new javax.swing.JTextField();
    jTextField2 = new javax.swing.JTextField();
    jPanel3 = new javax.swing.JPanel();
    jPanel4 = new javax.swing.JPanel();
    jRadioButton1 = new javax.swing.JRadioButton();
    jRadioButton2 = new javax.swing.JRadioButton();
    jRadioButton3 = new javax.swing.JRadioButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setMinimumSize(new java.awt.Dimension(200, 200));

    jPanel1.setMinimumSize(new java.awt.Dimension(400, 44));
    jPanel1.setLayout(new javax.swing.BoxLayout(jPanel1, javax.swing.BoxLayout.Y_AXIS));

    jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 255, 255)));
    jPanel2.setMaximumSize(new java.awt.Dimension(11111111, 2147483647));
    jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.X_AXIS));

    jTextField1.setFont(new java.awt.Font("Lucida Grande", 0, 48)); // NOI18N
    jTextField1.setText("jTextField1");
    jTextField1.setAlignmentY(0.0F);
    jTextField1.setMaximumSize(new java.awt.Dimension(150, 2147483647));
    jTextField1.setPreferredSize(new java.awt.Dimension(100, 42));
    jPanel2.add(jTextField1);

    jTextField2.setFont(new java.awt.Font("Lucida Grande", 0, 8)); // NOI18N
    jTextField2.setText("jTextField2");
    jTextField2.setAlignmentY(0.0F);
    jTextField2.setMaximumSize(new java.awt.Dimension(150, 2147483647));
    jTextField2.setPreferredSize(new java.awt.Dimension(100, 28));
    jTextField2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jTextField2ActionPerformed(evt);
        }
    });
    jPanel2.add(jTextField2);

    jPanel1.add(jPanel2);

    jPanel3.setForeground(new java.awt.Color(255, 51, 51));
    jPanel3.setLayout(new javax.swing.BoxLayout(jPanel3, javax.swing.BoxLayout.LINE_AXIS));

    jPanel4.setLayout(new javax.swing.BoxLayout(jPanel4, javax.swing.BoxLayout.Y_AXIS));

    jRadioButton1.setText("jRadioButton1");
    jPanel4.add(jRadioButton1);

    jRadioButton2.setText("jRadioButton2");
    jPanel4.add(jRadioButton2);

    jRadioButton3.setText("jRadioButton3");
    jPanel4.add(jRadioButton3);

    jPanel3.add(jPanel4);

    jPanel1.add(jPanel3);

    getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

    pack();
}

我真的不明白的是,当我更改jPanel3的布局时,jPanel2的渲染也会发生变化!

有没有人能给我一条可以遵循的方法?

EN

回答 3

Stack Overflow用户

发布于 2011-08-25 23:16:28

我推荐使用GridBagLayout,因为它可以最好地控制组件所在的位置以及它们占用的空间。

例如,要使JPanel 2和3填充您的内容窗格,您可以执行以下操作:

代码语言:javascript
复制
GridBagConstraints constraints = new GridBagConstraints();
JPanel jPanel1 = new JPanel(new GridBagLayout());
constraints.fill = GridBagConstraints.HORIZONTAL;
jPanel1.add(jPanel2, constraints);
constraints.gridy ++;
jPanel1.add(jPanel2, constraints);

此外,如果您希望Swing代码在几天后返回时易于理解,则需要将其分解为函数,并使用更具描述性的变量名称,如"topTextPanel“和"middleButtonPanel”。

票数 2
EN

Stack Overflow用户

发布于 2011-08-25 23:25:38

类似这样的东西可以作为使用BoxLayout的起点:

代码语言:javascript
复制
JPanel panel1= new JPanel();
panel1.setLayout(new BoxLayout(panel1, BoxLayout.Y_AXIS));

JPanel panel2= new JPanel();
panel2.setLayout(new BoxLayout(panel2, BoxLayout.X_AXIS));
panel2.setMinimumSize(...); panel2.setMaximumSize(...) ; panel2.setPreferredSize(...);

JPanel panel3 = new JPanel();
panel3.setLayout(new BoxLayout(panel3, BoxLayout.X_AXIS));
panel3 .setMinimumSize(...); panel3 .setMaximumSize(...) ; panel3 .setPreferredSize(...);

JTextField tf1 = new JTextField("text_field_1");
tf1.setMinimumSize(...); tf1.setMaximumSize(...) ; tf1.setPreferredSize(...);

panel2.add(tf1);
panel.add(panel2);
panel.add(panel3);
panel.add(Box.createVerticalGlue());
panel.add(Box.createRigidArea(new Dimension(...)));
票数 2
EN

Stack Overflow用户

发布于 2011-08-25 23:35:30

使用NetBeans完全可以做到这一点。

但是,要使用马蒂斯(NetBeans中的Swing设计器),您必须了解三件事:

  1. 要使容器适合其内容,您必须调整容器的大小,直到它与内容对齐为止。
  2. 要使内容与容器的大小一致,您必须调整内容的大小,直到内容捕捉到容器的边框。
  3. 您始终可以通过右键单击组件并从自动调整大小子菜单中选择所需内容来手动配置组件的自动调整大小行为。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7192822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档