1

我怎样才能让一个按钮并排放置。我使用 gridBagLayout 来设计布局。问题是按钮位置相距太远。我试图选择 CENTER 作为锚点,但这会使按钮重叠。如果我使用 WEST 和 EAST,则按钮放置的距离太远。

例如 SAVE ---------- NEW PATTERN 而不是 SAVE NEW_PATTERN。

JButton bSave = new JButton("SAVE");
JButton bPattern = new JButton("NEW_PATTERN");
con = new GridBagConstraints();
con.anchor=GridBagConstraints.WEST;
con.gridy = 3; con.gridx = 0;           
con.gridwidth = 1; con.gridheight = 1;      
con.insets= new Insets(2,5,2,2);        
m.setConstraints(bSave, con);
c.add(bSave);
con.weightx=1;
con.gridy=3; con.gridx=0;
con.anchor=GridBagConstraints.EAST;
m.setConstraints(bPattern,con);
c.add(bPattern);
4

6 回答 6

2

谢谢akf,我通过将flowLayout放在gridBagLayout中解决了这个问题。

....
JButton bSave = new JButton("Save");
JButton bPattern = new JButton("New Pattern");
JPanel pContainer = new JPanel();
pContainer.setLayout(new FlowLayout(FlowLayout.CENTER));
pContainer.add(bSave); pContainer.add(bPattern); 
con = new GridBagConstraints();
con.anchor=GridBagConstraints.CENTER;
con.gridy = 3; con.gridx = 0;           
con.gridwidth = 1; con.gridheight = 1;      
m.setConstraints(pContainer, con);
c.add(pContainer);
....
于 2009-10-08T02:34:00.953 回答
1

GridBagLayout 是最复杂的布局。如果您只是对齐几个按钮,我建议使用 FlowLayout(默认)或 BoxLayout。但是,如果你想使用 GridBagLayout,而不是调整锚点,将第二个按钮的 gridx 调整为 1。另外,不知道为什么你有一个 3 的网格而不是 0 的网格(除非你省略了其他使用 0-2 的网格的代码)。

于 2009-10-08T01:35:57.803 回答
0

为什么在发布新问题之前不先阅读旧帖子?

您在上一篇文章中提供了指向 Swing 教程的链接。因此,请阅读教程,尝试示例并使用适当的布局管理器或布局管理器组合来完成这项工作。

于 2009-10-08T01:46:00.497 回答
0

代替GridBagLayout,GridLayout是一个简单的解决方案。很容易设置:

JButton bSave = new JButton("SAVE");
JButton bPattern = new JButton("NEW_PATTERN");
JPanel panel = new JPanel(new GridLayout(1,2); // 1 row, 2 cols
panel.add(bSave);
panel.add(bPattern);

编辑:

只是出于好奇,我在玩弄你的原件,发现了一个只允许使用 GridBagLayout 的组合。它与您的原始版本没有太大区别:

GridBagConstraints con = new GridBagConstraints();
con.anchor=GridBagConstraints.WEST;
con.gridy = 3;
con.gridx = 0;                   
con.gridwidth = 1; 
con.gridheight = 1;          
con.insets= new Insets(2,5,2,2);        
m.setConstraints(bSave, con);
c.add(bSave);
con.weightx=0;
con.gridy=3;
con.gridx=1;//this is the big diff!
con.anchor=GridBagConstraints.EAST;
m.setConstraints(bPattern,con);
c.add(bPattern);
于 2009-10-08T01:50:59.420 回答
0

我建议您阅读 GridBagLayout 的教程,因为它是开箱即用的最先进的布局管理器,并使其他布局管理器过时。由于这些原因,值得学习。如果您将其视为一个网格,那么一切都会变得简单,那么您所要做的就是 x 和 y 坐标,这就是您在代码中遗漏的坐标。你快到了:)

混合布局管理器通常是一个非常糟糕的主意,因为在填充具有额外空间的容器时,它们的工作方式略有不同。

@camickr 根据我的评论,人们应该使用 GridBagLayout,因为它是最灵活的,可以在任何情况下使用。只有一个应该导致简单和可维护的可能。我还发现它很容易阅读,因为它是逻辑映射的。仅当您对所有组件使用一个约束对象时,约束才会改变,这显然是个坏主意。

于 2009-10-08T09:11:34.357 回答
0

此代码将按钮并排放置在屏幕中央。

关键是:

constraints.fill=GridBagConstraints.NONE;--> 使按钮不展开

constraints.insets.right=0;--> 使按钮并排站立

constraints.insets.left=0;--> 使按钮并排站立

constraints.weightx=1 --> 使按钮水平展开的单元格

constraints.anchor=GridBagConstraints.EAST;--> 使左键站在单元格的

constraints.anchor=GridBagConstraints.WEST;--> 使右键站在单元格的左侧

public static void main(String args[]){
        JFrame frame=new JFrame();
        Container cont=frame.getContentPane();
        cont.setLayout(new GridBagLayout());

        GridBagConstraints constraints=new GridBagConstraints();
        constraints.insets.top=2;
        constraints.insets.bottom=2;
        constraints.insets.left=0;// increment to separate buttons
        constraints.insets.right=0;// increment to separate buttons
        constraints.fill=GridBagConstraints.NONE;
        constraints.weightx=1;
        constraints.gridy=0;

        constraints.anchor=GridBagConstraints.EAST;
        constraints.gridx=0;
        cont.add(new JButton("Save"),constraints);

        constraints.anchor=GridBagConstraints.WEST;
        constraints.gridx=1;
        cont.add(new JButton("New Pattern"),constraints);

        frame.pack();
        frame.setVisible(true);
    }
于 2009-10-08T10:18:32.313 回答