Java 使用GridBagLayout将jButton相对于JTable水平居中
我有一个Java 使用GridBagLayout将jButton相对于JTable水平居中,java,swing,jtable,jbutton,gridbaglayout,Java,Swing,Jtable,Jbutton,Gridbaglayout,我有一个JTable,我在下面放置了3个JButtons。我已经设法把左边的按钮放在左边,把右边的按钮放在右边,但是我不知道如何把中间的按钮放在中间。我尝试过使用.weightx和.anchor但没有任何结果 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColum
JTable
,我在下面放置了3个JButton
s。我已经设法把左边的按钮放在左边,把右边的按钮放在右边,但是我不知道如何把中间的按钮放在中间。我尝试过使用.weightx
和.anchor
但没有任何结果
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
public class AccessView extends JPanel{
String[] columnNames = {"Date","Time","Type of access"};
DefaultTableModel tableModel;
JTable tAccesses;
JScrollPane scrollPane;
JButton bAdd, bMod, bDel;
public AccessView(){
createGUI();
}
public void createGUI(){
this.setBorder(BorderFactory.createTitledBorder("Accesses"));
this.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
bAdd = new JButton("Add");
bMod = new JButton("Mod");
bDel = new JButton("Del");
tableModel = new DefaultTableModel(25,columnNames.length);
tableModel.setColumnIdentifiers(columnNames);
tAccesses = new JTable(tableModel);
scrollPane = new JScrollPane(tAccesses);
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 3;
this.add(scrollPane, c);
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
c.anchor = GridBagConstraints.LAST_LINE_START;
this.add(bAdd, c);
c.gridx = 1;
c.gridy = 1;
this.add(bMod, c);
c.gridx = 2;
c.gridy = 1;
c.anchor = GridBagConstraints.LAST_LINE_END;
this.add(bDel, c);
}
}
有一些方法可以做到这一点:
- 因为您扩展了
,并为整个 面板,您只需为按钮添加额外的行。看起来像 Web中的表布局—实际上是这样的。有赞成也有反对 具有表格布局。主要的缺点是很难在一个长期的项目中坚持下去。特别是,不能在其他地方重复使用按钮JPanel
- 您可以按照@Izruo的建议,使用按钮创建其他面板。关键的特点是你可以很容易地将这个面板从网格的底部移动到左侧,添加到另一个类似的面板/菜单等。最简单的就足够了。创建
按钮面板后,您可以
- 将其添加到网格中。它比仅表格布局稍好一些
- 创建同时包含GridPanel和ButtonPanel的CompositePanel
在研究中,我注意到最后一个选项更可取。根据我个人的经验,这是一个最佳实践正如上面评论中所建议的那样,您可以使用另一个
JPanel
用于3JButton
s
对于JPanel
使用BoxLayout
,它将包含3个JButton
s,并且在每个JButton
之间,您可以获得以下输出:
在这种情况下:
JPanel
JPanel buttonsPane;
BoxLayout
buttonsPane = new JPanel();
buttonsPane.setLayout(new BoxLayout(buttonsPane, BoxLayout.LINE_AXIS));
Box.createHorizontalGlue()
:
buttonsPane.add(bAdd);
buttonsPane.add(Box.createHorizontalGlue());
buttonsPane.add(bMod);
buttonsPane.add(Box.createHorizontalGlue());
buttonsPane.add(bDel);
按钮平面
添加到JFrame
的SOUTH
对齐中(或将其与当前JPanel
一起添加,并编辑其约束条件(我使用了前者)):
实现类似结果的另一种方法(根据下面的@MadProgrammer注释)是更改约束并在
JButton
s之间添加“空”组件:
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
c.weightx = 1;
this.add(bAdd, c);
c.gridx = 1;
this.add(new JLabel(""), c); //Empty component just for the extra space
c.gridx = 2;
this.add(bMod, c);
c.gridx = 3;
this.add(new JLabel(""), c); //Empty component just for the extra space
c.gridx = 4;
this.add(bDel, c);
产生:
您可以为按钮引入额外的
JPanel
,并为其提供单独的LayoutManager
。不幸的是,我不知道是否有一个内置的可以完全满足您的需要。@Izruo我已经尝试使用另一个JPanel和BoxLayout来实现JButtons。不幸的是,我得到的只是将3个按钮居中,因为JPanel与JScrollPane的大小不匹配。不管怎样,谢谢你的建议。就我个人而言,我会使用GridBagLayout
作为按钮平面,但那只是我;)@如果我接受建议,我总是学习新东西,我能知道你喜欢的原因吗?在这种情况下,这是我能想到的最简单的方法of@Frakcool. 谢谢你的回答。我还必须将扩展JPanel的布局更改为BoxLayout。出于某种原因,尽管进行了您建议的更改,但它无法与GridBagLayout一起工作。@potato请参见更新的答案:)它也可以工作,而无需仅为JButton创建新的JPanel
s@Frakcool遗憾的是,很多UI设计都归结为“个人偏好”:P
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 1;
c.weightx = 1;
this.add(bAdd, c);
c.gridx = 1;
this.add(new JLabel(""), c); //Empty component just for the extra space
c.gridx = 2;
this.add(bMod, c);
c.gridx = 3;
this.add(new JLabel(""), c); //Empty component just for the extra space
c.gridx = 4;
this.add(bDel, c);