我正在寻找的是建议用于我的场景的最佳布局。我基本上有任意数量的子面板,可以放在容器面板中,可以由用户动态调整大小。所有子面板的宽度均为300像素,并且可以具有可变高度。我希望面板从左到右,从上到下放置在面板中,就像FlowLayout
一样。但是,我尝试使用FlowLayout
的任何内容都会使面板垂直居中,高度较低。我希望将面板固定在屏幕顶部。
我使用FlowLayout
创建了以下示例,以显示我的意思。
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class DynamicPanel extends JPanel {
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Test");
frame.add(new DynamicPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
});
}
public DynamicPanel() {
setupGUI();
}
private void setupGUI() {
this.setLayout(new FlowLayout(FlowLayout.LEFT));
this.add(getPanel(1, 4));
this.add(getPanel(2, 2));
}
private JPanel getPanel(int panelNum, int numButtons) {
JPanel panel = new JPanel(new GridBagLayout()) {
@Override
public Dimension getPreferredSize() {
Dimension ret = super.getPreferredSize();
ret.width = 300;
return ret;
}
};
panel.add(new JLabel("Panel "+panelNum), getGrid(0, 0, 1.0, 0));
for(int i = 0; i < numButtons; i++) {
panel.add(new JButton("Button"), getGrid(0, i+1, 1.0, 0));
}
return panel;
}
/*
* Returns the GridBagConstraints for the given x, y grid location
*/
private GridBagConstraints getGrid(int x, int y, double xweight, double yweight) {
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.gridx = x;
c.gridy = y;
c.weightx = xweight;
c.weighty = yweight;
return c;
}
}
在这个例子中,我希望标签Panel1和Panel2彼此笔直,而不是将Panel2设置得更低,因为关联的面板是居中的。
我想我可以使用GridBagLayout,并在容器面板中添加一个组件监听器,并在调整容器面板大小时为每个子面板相应地编辑GridBagContraints
,但我想知道是否有更好的方法去做这个?如果这很重要,在实际程序中,子面板将是自定义面板,而不仅仅是按钮列表。
提前感谢您的帮助!
答案 0 :(得分:1)
我能够实现这个目标
使用此...
private void setupGUI() {
this.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.NORTH;
gbc.weighty = 1;
this.add(getPanel(1, 4), gbc);
this.add(getPanel(2, 2), gbc);
}
问题是,你需要让你的手有点脏,因为没有布局管理器会完全按照你想要的那样做(可能除了MigLayout,但我从来没用过它)
我要做的是,每行创建一个JPanel
,将其布局设置为GridBagLayout
并使用上述概念进行布局以布置所需的列数,然后对每行执行此操作...