Java 网格布局问题
我正在设计一个面板,并在Java 网格布局问题,java,swing,jpanel,joptionpane,gridbaglayout,Java,Swing,Jpanel,Joptionpane,Gridbaglayout,我正在设计一个面板,并在选项窗格确认对话框中使用此面板,如下所示: JOptionPane.showConfirmDialog(null,slaveGroupPanel,messages.getString(“centrum.manageGroups”),JOptionPane.OK\u取消\u选项) 我的gridbag约束如下: addGroupButton.setText(messages.getString("centrum.slavegroup.add")); gridB
选项窗格确认对话框中使用此面板,如下所示:
JOptionPane.showConfirmDialog(null,slaveGroupPanel,messages.getString(“centrum.manageGroups”),JOptionPane.OK\u取消\u选项)代码>
我的gridbag约束如下:
addGroupButton.setText(messages.getString("centrum.slavegroup.add"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 6;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
add(addGroupButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
add(addGroupTextField, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
add(groupNameLabel, gridBagConstraints);
groupComboBox.setModel(new DefaultComboBoxModel(slaveGroupHash.keySet().toArray() ));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.weightx = 1;
add(groupComboBox, gridBagConstraints);
allSlavesList.setModel(new DefaultListModel());
for (int i = 0; i < allSlaves.length; i++) {
((DefaultListModel)allSlavesList.getModel()).addElement(allSlaves[i]);
}
allSlavesList.setVisibleRowCount(4);
jScrollPane2.setViewportView(allSlavesList);
jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.45;
gridBagConstraints.weighty = 1.0;
add(jScrollPane2, gridBagConstraints);
slavesInGroupList.setModel(new DefaultListModel());
slavesInGroupList.setVisibleRowCount(4);
jScrollPane3.setViewportView(slavesInGroupList);
jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.45;
gridBagConstraints.weighty = 1.0;
add(jScrollPane3, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
add(allSlavesLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
add(slavesInGroupLabel, gridBagConstraints);
addSlaveButton.setIcon(GeneralObjects.getrightIcon());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 3;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 1.0;
add(addSlaveButton, gridBagConstraints);
deleteSlaveButton.setIcon(GeneralObjects.getleftIcon());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 4;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 1.0;
add(deleteSlaveButton, gridBagConstraints);
renameButton.setText(messages.getString("centrum.slavegroup.rename"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 6;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
add(renameButton, gridBagConstraints);
deleteButton.setText(messages.getString("centrum.slavegroup.delete"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 5;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
add(deleteButton, gridBagConstraints);
您应该尝试使用更多的嵌套,因为您不能在平面布局中设置这样的布局
从你的描述中,我看到:
- 包含3行的根面板(使用
GridBagLayout
进行设置,并为最后一行提供所有额外的垂直空间)
- 第1行:标签、文本字段和按钮-->使用
BorderLayout
- 第2行:一个组合框和两个按钮-->使用
GridBagLayout
并为组合框提供所有额外空间
- 第3行:2个标签、2个列表和2个按钮-->使用
GridBagLayout
进行设置
现在,使用GridBagLayout
需要了解的一件事是weightx/weighty
不是它将分布的宽度/高度的百分比,而是如何分布“额外”空间。它将首先给出每个组件的首选尺寸,然后,如果有任何额外空间,它将根据每个组件的重量分配该空间
对于最后一行,每个“列”的宽度基于2个标签的首选大小(一个明显比另一个宽)和2个JList的首选大小(基于JList的内容)
这里是您的SSCCE的更新(尽管我不得不对其进行多次返工,因为代码有点凌乱:尝试按顺序做事,首先设置组件,然后按它们出现的顺序排列,这更易于阅读)
导入java.awt.BorderLayout;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入javax.swing.DefaultComboxModel;
导入javax.swing.DefaultListModel;
导入javax.swing.JDialog;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.SwingUtilities;
公共级SSCCE{
私有javax.swing.JButton addGroupButton;
私有javax.swing.JTextField addGroupTextField;
私有javax.swing.JButton addSlaveButton;
private javax.swing.JList allSlavesList;
私有javax.swing.JButton deleteButton;
私有javax.swing.JButton deleteSlaveButton;
私有javax.swing.JComboBox-groupComboBox;
私有javax.swing.JScrollPane-jScrollPane2;
私有javax.swing.JScrollPane-jScrollPane3;
私有javax.swing.JButton重命名按钮;
私有javax.swing.JLabel allSlavesLabel;
私有javax.swing.JLabel slavesInGroupLabel;
private javax.swing.JList slavesInGroupList;
私有JLabel-groupnamelab;
公共服务{
}
公共JPanel createPanel(){
JPanel面板=新的JPanel();
setLayout(新java.awt.GridBagLayout());
addGroupButton=newjavax.swing.JButton();
addGroupTextField=newjavax.swing.JTextField();
addSlaveButton=newjavax.swing.JButton();
allSlavesList=newjavax.swing.JList();
deleteButton=newjavax.swing.JButton();
deleteSlaveButton=newjavax.swing.JButton();
groupComboBox=newjavax.swing.JComboBox();
jScrollPane2=newjavax.swing.JScrollPane();
jScrollPane3=newjavax.swing.JScrollPane();
renameButton=newjavax.swing.JButton();
allSlavesLabel=newjavax.swing.JLabel(“所有从机”);
slavesInGroupLabel=newjavax.swing.JLabel(“此组中的设备”);
groupNameLabel=新的JLabel(“Groupd名称:”);
slavesInGroupList=newjavax.swing.JList();
setModel(新的DefaultComboxModel(新对象[]{“一”、“二”、“三”}));
addGroupButton.setText(“添加”);
setModel(新的DefaultListModel());
setModel(新的DefaultListModel());
rename按钮.setText(“重命名”);
deleteButton.setText(“删除”);
addSlaveButton.setText(“->”);
deleteSlaveButton.setText(“谢谢您的回复。但我的实际问题是,右侧的Jlist比左侧的更宽,这仍然存在于您的代码中。我通过在return语句之前添加panel.setPreferredSize(新维度(600300)),使面板更宽。因此,与Jlist相比,标签变得更小(所以它不应该对Jlist的大小产生影响)但是右边的Jlist仍然很宽。这将如何解决。@Alptugay如上所述,问题是您有两个不同宽度的标签,它们是影响这些列大小的标签。因为“此组中的设备”比“所有设备”宽得多",列的宽度不相同。到目前为止,我还没有找到一个真正干净的解决方案。一种方法是根据两个标签的最大首选大小设置这两个标签的首选大小,但这不是很干净,在运行时不支持L&F开关。这样就可以了。设置这两个标签的首选大小将标签设置为较宽标签的最大尺寸就成功了。这对我来说已经足够了。谢谢你的帮助。@Alptugay请记住,这是一个丑陋的把戏,你应该尽量避免设置首选尺寸。设置首选尺寸几乎总是会让事情变得更糟。
import javax.swing.*;
import java.awt.*;
public class SSCCE {
private javax.swing.JButton addGroupButton;
private javax.swing.JTextField addGroupTextField;
private javax.swing.JButton addSlaveButton;
private javax.swing.JList allSlavesList;
private javax.swing.JButton deleteButton;
private javax.swing.JButton deleteSlaveButton;
private javax.swing.JComboBox groupComboBox;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JButton renameButton;
private javax.swing.JLabel groupNameLabel;
private javax.swing.JLabel allSlavesLabel;
private javax.swing.JLabel slavesInGroupLabel;
private javax.swing.JList slavesInGroupList;
public SSCCE() {
}
public JPanel createPanel(){
JPanel panel = new JPanel();
panel.setLayout(new java.awt.GridBagLayout());
addGroupButton=new javax.swing.JButton();
addGroupTextField=new javax.swing.JTextField();
addSlaveButton=new javax.swing.JButton();
allSlavesList=new javax.swing.JList();
deleteButton=new javax.swing.JButton();
deleteSlaveButton=new javax.swing.JButton();
groupComboBox=new javax.swing.JComboBox();
jScrollPane2=new javax.swing.JScrollPane();
jScrollPane3=new javax.swing.JScrollPane();
renameButton=new javax.swing.JButton();
groupNameLabel=new javax.swing.JLabel();
allSlavesLabel=new javax.swing.JLabel();
slavesInGroupLabel=new javax.swing.JLabel();
slavesInGroupList=new javax.swing.JList();
allSlavesList.setModel(new DefaultListModel());
slavesInGroupList.setModel(new DefaultListModel());
GridBagConstraints gridBagConstraints;
addGroupButton.setText("add");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 6;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
panel.add(addGroupButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
panel.add(addGroupTextField, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
panel.add(groupNameLabel, gridBagConstraints);
groupComboBox.setModel(new DefaultComboBoxModel(new Object[]{"one","two","three"}));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.weightx = 1;
panel.add(groupComboBox, gridBagConstraints);
allSlavesList.setVisibleRowCount(4);
jScrollPane2.setViewportView(allSlavesList);
jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.45;
gridBagConstraints.weighty = 1.0;
panel.add(jScrollPane2, gridBagConstraints);
slavesInGroupList.setVisibleRowCount(4);
jScrollPane3.setViewportView(slavesInGroupList);
jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.45;
gridBagConstraints.weighty = 1.0;
panel.add(jScrollPane3, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
panel.add(allSlavesLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
panel.add(slavesInGroupLabel, gridBagConstraints);
//addSlaveButton.setIcon(GeneralObjects.getrightIcon());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 3;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 1.0;
panel.add(addSlaveButton, gridBagConstraints);
//deleteSlaveButton.setIcon(GeneralObjects.getleftIcon());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 4;
gridBagConstraints.weightx = 0.1;
gridBagConstraints.weighty = 1.0;
panel.add(deleteSlaveButton, gridBagConstraints);
renameButton.setText("rename");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 6;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
panel.add(renameButton, gridBagConstraints);
deleteButton.setText("delete");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 5;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
panel.add(deleteButton, gridBagConstraints);
((DefaultListModel)allSlavesList.getModel()).addElement("one");
((DefaultListModel)allSlavesList.getModel()).addElement("two");
((DefaultListModel)allSlavesList.getModel()).addElement("three");
((DefaultListModel)slavesInGroupList.getModel()).addElement("one");
((DefaultListModel)slavesInGroupList.getModel()).addElement("two");
((DefaultListModel)slavesInGroupList.getModel()).addElement("three");
panel.setPreferredSize(new Dimension(600,300));
return panel;
}
public static void main(String[] args){
SSCCE a = new SSCCE();
JOptionPane.showConfirmDialog(null, a.createPanel(), "centrum.manageGroups", JOptionPane.OK_CANCEL_OPTION);
}
}
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class SSCCE {
private javax.swing.JButton addGroupButton;
private javax.swing.JTextField addGroupTextField;
private javax.swing.JButton addSlaveButton;
private javax.swing.JList allSlavesList;
private javax.swing.JButton deleteButton;
private javax.swing.JButton deleteSlaveButton;
private javax.swing.JComboBox groupComboBox;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JButton renameButton;
private javax.swing.JLabel allSlavesLabel;
private javax.swing.JLabel slavesInGroupLabel;
private javax.swing.JList slavesInGroupList;
private JLabel groupNameLabel;
public SSCCE() {
}
public JPanel createPanel() {
JPanel panel = new JPanel();
panel.setLayout(new java.awt.GridBagLayout());
addGroupButton = new javax.swing.JButton();
addGroupTextField = new javax.swing.JTextField();
addSlaveButton = new javax.swing.JButton();
allSlavesList = new javax.swing.JList();
deleteButton = new javax.swing.JButton();
deleteSlaveButton = new javax.swing.JButton();
groupComboBox = new javax.swing.JComboBox();
jScrollPane2 = new javax.swing.JScrollPane();
jScrollPane3 = new javax.swing.JScrollPane();
renameButton = new javax.swing.JButton();
allSlavesLabel = new javax.swing.JLabel("All slaves");
slavesInGroupLabel = new javax.swing.JLabel("Devices in this group");
groupNameLabel = new JLabel("Groupd name:");
slavesInGroupList = new javax.swing.JList();
groupComboBox.setModel(new DefaultComboBoxModel(new Object[] { "one", "two", "three" }));
addGroupButton.setText("add");
allSlavesList.setModel(new DefaultListModel());
slavesInGroupList.setModel(new DefaultListModel());
renameButton.setText("rename");
deleteButton.setText("delete");
addSlaveButton.setText("->");
deleteSlaveButton.setText("<-");
allSlavesList.setVisibleRowCount(4);
jScrollPane2.setViewportView(allSlavesList);
jScrollPane2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
((DefaultListModel) allSlavesList.getModel()).addElement("one");
((DefaultListModel) allSlavesList.getModel()).addElement("two");
((DefaultListModel) allSlavesList.getModel()).addElement("three");
((DefaultListModel) slavesInGroupList.getModel()).addElement("one");
((DefaultListModel) slavesInGroupList.getModel()).addElement("two");
((DefaultListModel) slavesInGroupList.getModel()).addElement("three");
slavesInGroupList.setVisibleRowCount(4);
jScrollPane3.setViewportView(slavesInGroupList);
jScrollPane3.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// Let's split your display in 3 rows
panel = new JPanel(new GridBagLayout());
JPanel row1 = new JPanel(new BorderLayout(3, 3));
JPanel row2 = new JPanel(new GridBagLayout());
JPanel row3 = new JPanel(new GridBagLayout());
// Use GBL to make three rows and give all extra vertical space to the last one
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(3, 3, 3, 3);
panel.add(row1, gbc);
panel.add(row2, gbc);
// Gives all extra v-space to last row
gbc.weighty = 1.0;
panel.add(row3, gbc);
GridBagConstraints gridBagConstraints;
// Set up row 1
row1.add(groupNameLabel, BorderLayout.WEST);
row1.add(addGroupButton, BorderLayout.EAST);
row1.add(addGroupTextField);// In the middle so that it takes all the width and it won't stretch vertically because row1 has weighty
// set to 0.0
// Set up row 2
// We give all extra space to the combo box
gbc = new java.awt.GridBagConstraints();
gbc.insets = new Insets(3, 3, 3, 3);
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
row2.add(groupComboBox, gbc);
gbc.weightx = 0;
row2.add(deleteButton, gbc);
row2.add(renameButton, gbc);
// Set up row3
gbc = new java.awt.GridBagConstraints();
gbc.insets = new Insets(3, 3, 3, 3);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1.0;
gbc.anchor = GridBagConstraints.WEST;
row3.add(allSlavesLabel, gbc);
gbc.gridx = 2;
row3.add(slavesInGroupLabel, gbc);
gbc.weighty = 1.0;
gbc.weightx = 1.0;
gbc.gridheight = 2;
gbc.gridx = 0;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
row3.add(jScrollPane2, gbc);
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridheight = 1;
gbc.gridx = 1;
gbc.weightx = 0;
row3.add(addSlaveButton, gbc);
gbc.gridy = 2;
row3.add(deleteSlaveButton, gbc);
gbc.gridheight = 2;
gbc.gridx = 2;
gbc.gridy = 1;
gbc.fill = GridBagConstraints.BOTH;
row3.add(jScrollPane3, gbc);
return panel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SSCCE a = new SSCCE();
JDialog dialog = new JDialog();
dialog.add(a.createPanel());
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
// JOptionPane.showConfirmDialog(null, a.createPanel(), "centrum.manageGroups", JOptionPane.OK_CANCEL_OPTION);
}
});
}
}