如何相对于另一个组件布局组件?

时间:2012-01-14 22:51:32

标签: java swing layout resize

我希望有以下布局:

(即jbutton和jlabel位于jpanel,jbutton居中,jlabel紧随其后。布局应该能够调整大小。编辑: jbutton和jlabel的大小在调整大小时是不变的。)

我想到了以下内容:

  1. 使用适当的布局管理器。我不认识一个。我可以将jbutton和jlabel添加到另一个jpanel并将这个新的jpanel添加到大型jpanel的中心,但在这种情况下,jbutton不会居中。

    修改:我尝试使用this proposal:(提案已编辑,代码现已正确)

    public class MainFrame extends JFrame {
        public static void main(String[] args) {
            new MainFrame();
        }
    
    
    public MainFrame() {
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1;
        add(new JPanel(), c);
        c.gridx = 1;
        c.weightx = 0;
        c.anchor = GridBagConstraints.CENTER;
        add(new JButton("Button"), c);
        c.gridx = 2;
        c.weightx = 1;
        c.anchor = GridBagConstraints.WEST;
        add(new JLabel("Label"), c);
        pack();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    
    } }

    但是它产生以下输出,其中按钮不是居中的:

  2. 将jbutton和jlabel添加到jpanel。将ComponentListener添加到jpanel并覆盖componentResized。 Overriden方法如下所示:

    public void componentResized(ComponentEvent e) {
        int x = button.getX() + button.getWidth() + 3;
        int y = button.getY();
        label.setLocation(new Point(x, y));
    }  
    

    当布局管理器和jlabel的位置通过此方法自动调整大小时,将选择JButton的位置。但只有在调整大小完成后才会调用componentResized。因此,在调整jlabel大小的过程中,位置将由布局管理器定义,这是不合适的。

  3. 将jbutton添加到内容窗格并将jlabel添加到glass窗格。但是我的调整大小与之前的情况相同。
  4. 如何实现此布局?

2 个答案:

答案 0 :(得分:1)

看起来你可以使用3列的网格包布局。第一列和第三列必须具有相同的重量,因此宽度相同。中间的列没有重量所以会坐在中间。我会为你尝试,但我在iPhone上打字! HTH

请参阅注释,这是我对示例代码的编辑:

public class MainFrame extends JFrame {
    public static void main(String[] args) {
        new MainFrame();
    }

    public MainFrame() {
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        c.weightx = 1;
        Component panel = new JPanel();
        panel.setBackground(Color.blue);
        add(panel, c);
        c.gridx = 1;
        c.weightx = 0;
        c.anchor = GridBagConstraints.CENTER;
        add(new JButton("Button"), c);
        c.gridx = 2;
        c.weightx = 1;
        c.anchor = GridBagConstraints.WEST;
        JLabel label = new JLabel("Label");
        add(label, c);

        panel.setPreferredSize(label.getPreferredSize());

        pack();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

答案 1 :(得分:1)

使用支持您需要的LayoutManager即可。高级管理器允许定义大小等于宽度/高度的组(列/行)。如果核心经理不允许这样的语义规范,那就去找第三方经理f.i.任何BigThree:MigLayout,FormLayout或DesignGridLayout。投入学习的时间将得到充​​分利用: - )

在MigLayout(我个人最喜欢的)中,约束是“sizegroup groupName”或“sg groupName”(如果只有组,groupName可以为空),f.i。

    JButton button = new JButton("somesize");
    JLabel label = new JLabel("--outer--");
    MigLayout layout = new MigLayout("debug, wrap 3", 
           "[sizegroup, grow][center][sizegroup, grow]");
    JComponent comp = new JPanel(layout);
    // start adding component in second column 
    comp.add(button, "cell 1 0");
    comp.add(label);
    // add something spanning all column in second row for comparison
    comp.add(new JButton("somesize"), "span 3, center");