如何控制面板的大小
How to control the size of the panels
我正在学习 swing gui,当我使用以下代码时得到了这个结果:-
我使用的代码:-
private void initUI() {
JTextArea visualize=new JTextArea();
visualize.setEditable(false);
//DEFINE BUTTONS....
JButton[] buttons1={addition,subtraction,division,multiplication};
JButton [] buttons2={expr,date,conversion};
JPanel numerical=new JPanel(new FlowLayout());
numerical.setPreferredSize(new Dimension(350, 50));
for(int i=0;i<buttons1.length;i++){
numerical.add(buttons1[i]);
}
numerical.setBorder(new TitledBorder("Numerical Operations"));
JPanel nonnum=new JPanel(new FlowLayout());
nonnum.setPreferredSize(new Dimension(500, 50));
for(int i=0;i<buttons2.length;i++){
nonnum.add(buttons2[i]);
}
nonnum.setBorder(new TitledBorder("Non-numerical Operations"));
JPanel operations = new JPanel(new BorderLayout(2,2));
operations.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
operations.setSize(800, 100);
operations.add(numerical,BorderLayout.WEST);
operations.add(nonnum,BorderLayout.EAST);
JTable sheet = new JTable(10,5);
add(visualize, BorderLayout.NORTH);
add(sheet,BorderLayout.SOUTH);
add(operations,BorderLayout.CENTER);
pack();
setSize(1000, 700);
setTitle("Spreadsheet Application");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
但我真正想要的是:-
我的问题:-
- 为什么操作面板太长了?
- 如何更改它的高度?
- "operations.setSize(..)" 不行吗?
因为这就是 BorderLayout
的工作原理,请仔细查看 How to Use BorderLayout。 CENTRE
位置将占据框架的所有剩余 space,而 NORTH
和 SOUTH
位置将尝试并遵循组件的首选大小。
您可以使用 GridBagLayout
,这样您可以更好地控制布局或使用一系列复合布局。
类似...
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.BOTH;
add(visualize, gbc);
add(operations, gbc);
gbc.gridy = 1;
add(sheet, gbc);
通常不鼓励从像 JFrame
这样的顶级容器扩展,相反你应该使用像 JPanel
这样的东西来定义你的 UI,然后将它们添加到你想要的容器中。这增加了可重用性并使其更容易在不同的容器上使用
您可能还想看看How to Use Scroll Panes
我们中的一些人发现 GridBagLayout 非常痛苦,您可能不必使用它来做您想做的事情。
布局管理器背后的想法是让布局管理器控制其组件的大小和位置,这样您就不必费力地处理它们。 MP 是对的,GridBag 允许您进行很多控制,但这也意味着您必须做很多事情才能让它做您想做的事。
因此,另一种方法是:制作一个 JPanel 来容纳 visualize
和 operations
面板;为这个新面板提供一个 Y_AXIS 方向的 BoxLayout,然后按照您希望它们出现的顺序添加它们,从上到下。
然后将sheet
放在JFrame的BorderLayout.CENTER中。事实上,我认为您会想听取 MP 的建议并阅读有关 JScrollPane 的教程;据我所知,您创建面板,然后使用面板作为构造参数创建 JScrollPane 实例,然后将滚动面板实例添加到 JFrame(在 CENTER 中,在您的例子中)。
它位于中心,然后会随着用户改变 window 大小而展开和收缩。
祝你好运。 Swing 需要一些时间来适应。
尝试使用 GroupLayout。
我也是 swing gui 的新手并且遇到了类似的问题 - GroupLayout 挽救了这一天
JPanel complete=new JPanel();
GroupLayout gl=new GroupLayout(complete);
complete.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
gl.setHorizontalGroup(gl.createParallelGroup() //this is parallel bcz you need components vertically
.addComponent(visualize) //you MUST add components to both horizontal and vertical groups
.addComponent(operations)
.addComponent(sheet)
);
gl.setVerticalGroup(gl.createSequentialGroup() //NOTE that this is sequential
.addComponent(visualize)
.addComponent(operations)
.addGap(50) //you can add gaps if you want
.addComponent(sheet)
);
add(complete);
我正在学习 swing gui,当我使用以下代码时得到了这个结果:-
我使用的代码:-
private void initUI() {
JTextArea visualize=new JTextArea();
visualize.setEditable(false);
//DEFINE BUTTONS....
JButton[] buttons1={addition,subtraction,division,multiplication};
JButton [] buttons2={expr,date,conversion};
JPanel numerical=new JPanel(new FlowLayout());
numerical.setPreferredSize(new Dimension(350, 50));
for(int i=0;i<buttons1.length;i++){
numerical.add(buttons1[i]);
}
numerical.setBorder(new TitledBorder("Numerical Operations"));
JPanel nonnum=new JPanel(new FlowLayout());
nonnum.setPreferredSize(new Dimension(500, 50));
for(int i=0;i<buttons2.length;i++){
nonnum.add(buttons2[i]);
}
nonnum.setBorder(new TitledBorder("Non-numerical Operations"));
JPanel operations = new JPanel(new BorderLayout(2,2));
operations.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
operations.setSize(800, 100);
operations.add(numerical,BorderLayout.WEST);
operations.add(nonnum,BorderLayout.EAST);
JTable sheet = new JTable(10,5);
add(visualize, BorderLayout.NORTH);
add(sheet,BorderLayout.SOUTH);
add(operations,BorderLayout.CENTER);
pack();
setSize(1000, 700);
setTitle("Spreadsheet Application");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
但我真正想要的是:-
我的问题:-
- 为什么操作面板太长了?
- 如何更改它的高度?
- "operations.setSize(..)" 不行吗?
因为这就是 BorderLayout
的工作原理,请仔细查看 How to Use BorderLayout。 CENTRE
位置将占据框架的所有剩余 space,而 NORTH
和 SOUTH
位置将尝试并遵循组件的首选大小。
您可以使用 GridBagLayout
,这样您可以更好地控制布局或使用一系列复合布局。
类似...
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.BOTH;
add(visualize, gbc);
add(operations, gbc);
gbc.gridy = 1;
add(sheet, gbc);
通常不鼓励从像 JFrame
这样的顶级容器扩展,相反你应该使用像 JPanel
这样的东西来定义你的 UI,然后将它们添加到你想要的容器中。这增加了可重用性并使其更容易在不同的容器上使用
您可能还想看看How to Use Scroll Panes
我们中的一些人发现 GridBagLayout 非常痛苦,您可能不必使用它来做您想做的事情。
布局管理器背后的想法是让布局管理器控制其组件的大小和位置,这样您就不必费力地处理它们。 MP 是对的,GridBag 允许您进行很多控制,但这也意味着您必须做很多事情才能让它做您想做的事。
因此,另一种方法是:制作一个 JPanel 来容纳 visualize
和 operations
面板;为这个新面板提供一个 Y_AXIS 方向的 BoxLayout,然后按照您希望它们出现的顺序添加它们,从上到下。
然后将sheet
放在JFrame的BorderLayout.CENTER中。事实上,我认为您会想听取 MP 的建议并阅读有关 JScrollPane 的教程;据我所知,您创建面板,然后使用面板作为构造参数创建 JScrollPane 实例,然后将滚动面板实例添加到 JFrame(在 CENTER 中,在您的例子中)。
它位于中心,然后会随着用户改变 window 大小而展开和收缩。
祝你好运。 Swing 需要一些时间来适应。
尝试使用 GroupLayout。 我也是 swing gui 的新手并且遇到了类似的问题 - GroupLayout 挽救了这一天
JPanel complete=new JPanel();
GroupLayout gl=new GroupLayout(complete);
complete.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
gl.setHorizontalGroup(gl.createParallelGroup() //this is parallel bcz you need components vertically
.addComponent(visualize) //you MUST add components to both horizontal and vertical groups
.addComponent(operations)
.addComponent(sheet)
);
gl.setVerticalGroup(gl.createSequentialGroup() //NOTE that this is sequential
.addComponent(visualize)
.addComponent(operations)
.addGap(50) //you can add gaps if you want
.addComponent(sheet)
);
add(complete);