4

我想要这个:

草图

我试过这个:

    // Vertically center
    formatbp.setLayout (new GridBagLayout()); // formatbp is a JPanel
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = 0;
    gbc.gridy = GridBagConstraints.RELATIVE;

    rbpanel.setLayout(new BoxLayout(rbpanel, BoxLayout.PAGE_AXIS)); // rbpanel is also a JPanel
    rb = new ButtonGroup();
    rbpanel.add(new JLabel("Words are seperated by: "));

    rbLinesOrTabs.setSelected(true);
    rb.add(rbLinesOrTabs);
    rbpanel.add(rbLinesOrTabs);
    rbLinesOrTabs.addActionListener(this);

    rbotherpanel = new JPanel(new FlowLayout());
    rb.add(rbOther);
    rbpanel.add(rbOther);
    rbOther.addActionListener(this);

    othercharfield.setEnabled(false); // Is going to be enabled when rbOther gets selected (and disabled again when rbLinesOrTabs is selected again), that is where the actionlisteners are for
    rbotherpanel.add(othercharfield);

    rbpanel.add(rbotherpanel);

    formatbp.add(rbpanel,gbc);
    formatbp.add(formatb,gbc); // formatb is the button

(大多数在代码中较早初始化的对象)

但这是结果:

结果1

我究竟做错了什么?

编辑:我发现我在这里犯了一个错误:

rbpanel.add(rbOther);

那应该是:

rbotherpanel.add(rbOther);

现在我得到:

结果2

更好,但其他项目未正确对齐。(如您所见,它有点偏右)

4

3 回答 3

2

使用 MigLayout 的一体化方法(是的,这确实是我目前最喜欢的 :-)

    MigLayout layout = new MigLayout("debug", "[][]");
    JComponent content = new JPanel(layout);
    content.add(new JLabel("Words are separated by: "), "span");
    JRadioButton radio = new JRadioButton("Lines or tabs");
    content.add(radio, "wrap");
    // split the cell so it will contain both the other button
    // and the textfield
    content.add(new JRadioButton("Other:"), "split 2");
    // get the right margin of the upper radiobutton
    int rightMargin = radio.getInsets().right; 
    content.add(new JTextField(), "grow, wrap, " +
        // remove the gap to the preceding radiobutton
            "gapx 0, " +
        // set the padding to compensate the right edge
            "pad 0 0 0 -" + rightMargin + "px");
    content.add(new JButton("Format"), "span, center");
    showInFrame(content, "align to button text");

共享单元中微调的视觉结果有点依赖 LAF。在 Windows 中看起来不错,在 Nimbus 中不太好(后者在没有任何补偿的情况下看起来最好),因此您需要进行一些试验。

于 2013-06-27T15:20:01.133 回答
2

您正在向 rbPanel 添加四个内容,这意味着您将获得四行(就像您的屏幕截图示例一样)。Other 和 textfield 需要在同一行,因此您应该将它们放在自己的面板中,或者使用 GridbagConstraints 正确定位所有组件。

使用 GridX 和 GridY 而不是 RELATIVE,因为这使代码更容易理解。

于 2013-06-27T14:03:44.040 回答
0

试试下面的代码,

public static void main(String[] args)
 {
        SwingUtilities.invokeLater(new Runnable()
        {

            @Override
            public void run()
            {
                JFrame frame = new JFrame();
                frame.setBounds(0, 0, 300, 300);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


                JPanel formatbp = new JPanel(); 
                formatbp.setLayout (new GridBagLayout()); // formatbp is a JPanel
                GridBagConstraints gbc = new GridBagConstraints();
                gbc.gridx = 0;
                gbc.gridy = GridBagConstraints.RELATIVE;

                JPanel rbpanel = new JPanel();
                rbpanel.setLayout(new BoxLayout(rbpanel, BoxLayout.Y_AXIS)); // rbpanel is also a JPanel
                ButtonGroup rb = new ButtonGroup();
                rbpanel.add(new JLabel("Words are seperated by: "));

                JRadioButton rbLinesOrTabs = new JRadioButton("line or tabs");
                rbLinesOrTabs.setSelected(true);
                rb.add(rbLinesOrTabs);
                rbpanel.add(rbLinesOrTabs);
//                rbLinesOrTabs.addActionListener(this);
                JRadioButton rbOther = new JRadioButton("others:");
                JPanel rbotherpanel = new JPanel();
                rb.add(rbOther);
                rbotherpanel.add(rbOther);
//                rbOther.addActionListener(this);
                JTextField othercharfield = new JTextField("test", 4);
//                othercharfield.setColumns(800);
//                othercharfield.setEnabled(false); // Is going to be enabled when rbOther gets selected (and disabled again when rbLinesOrTabs is selected again), that is where the actionlisteners are for
                rbotherpanel.add(othercharfield);

                rbpanel.add(rbotherpanel);

                formatbp.add(rbpanel,gbc);
                JButton formatb = new JButton("format");
                formatbp.add(formatb,gbc); // formatb is the button
                frame.getContentPane().add(formatbp);
                frame.pack();
                frame.setVisible(true);                
            }
        });

    }
于 2013-06-27T14:20:30.193 回答