我对Java Swing相对较新,我在理解Grid布局如何处理某些事情时遇到了一些麻烦,如果他们不能,那么Gridbag布局(据称更强大的布局)如何做到这一点。
这是我尝试使用网格布局
的程序import javax.swing.*;
import java.awt.*;
//import java.awt.event.*;
public class Swing24
{
public static void main(String[] args)
{
JFrame f1= new JFrame("Grid Layout Test");
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f1.setResizable(true);
f1.setLocation(500,200);
f1.setSize(600,600);
JPanel p1 = new JPanel();
p1.setBackground(Color.black);
f1.add(p1);
JButton b1= new JButton("Button 1");
b1.setBackground(Color.white);
JButton b2= new JButton("Button 2");
b2.setBackground(Color.white);
JButton b3= new JButton("Button 3");
b3.setBackground(Color.white);
JLabel lb1=new JLabel(" Label 1");
lb1.setForeground(Color.orange);
//lb1.setOpaque(true);
lb1.setBackground(Color.yellow);
JLabel lb2=new JLabel(" Label 2");
lb2.setBackground(Color.orange);
lb2.setOpaque(true);
GridLayout glm1=new GridLayout(2,3,0,0);
p1.setLayout(glm1);
p1.add(b1);
p1.add(b2);
p1.add(b3);
p1.add(lb1);
p1.add(lb2);
f1.setVisible(true);
}
}
上述程序允许我将容器分成2行3列。基本上我可以用一个网格布局将容器分成m行和n列。但它会连续添加组件(按钮和标签)。
问题1:如何在大小为(10,10)的网格中直接向单元格(4,3)添加按钮? 问题2:按钮可以占用网格布局中的多个单元吗?
如果无法解决上述任何问题,那么gridbag布局如何帮助解决问题。 我尝试使用带按钮的gridbag布局。但它被置于中心位置!我怎么能把它放在一个容器中的单元格(4,3)中,该容器可分为大小(10,10)<10行10列&gt;
答案 0 :(得分:1)
1)您无法将组件添加到特定单元格,但在that question中,您可以找到某种类型的技巧。
2)这是另一个trick,在单元格内嵌有lyout,用于合并。
您可以在GridBagLayout
的帮助下完成所需的一切。观看GridBagConstraints
它可以帮助您正确布局组件。
查看GridBagConstraints
的属性:
gridwidth
,gridheight
,gridx
,gridy
,anchor
。
但如果你只想在容器中添加一个组件,你需要在单元格(4,3)周围留出空格的技巧。
另请阅读GridBagLayout的教程。
编辑:你可以尝试这样的事情public class Form extends JFrame {
public Form() {
getContentPane().setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weightx = 1;
c.weighty = 1;
for(int i =0;i<10;i++){
c.gridx = i;
for(int j =0;j<10;j++){
c.gridy = j;
if(i == 3 && j == 2){
c.fill = GridBagConstraints.NONE;
getContentPane().add(new JButton("btn"),c);
} else {
c.fill = GridBagConstraints.BOTH;
JPanel p = new JPanel();
p.setBorder(BorderFactory.createLineBorder(Color.red));
getContentPane().add(p,c);
}
}
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
}
public static void main(String[] args) throws Exception {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Form().setVisible(true);
}
});
}
}
EDIT2:它不是真正的细胞(4,3),而是相同的比例
public Form() {
getContentPane().setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weightx = 0.2;
c.weighty = 0.3;
c.fill = GridBagConstraints.BOTH;
getContentPane().add(new JLabel(" "),c);
c.gridx++;
c.gridy++;
c.fill = GridBagConstraints.NONE;
getContentPane().add(new JButton("btn"),c);
c.weightx = 0.7;
c.weighty = 0.6;
c.gridx++;
c.gridy++;
c.fill = GridBagConstraints.BOTH;
getContentPane().add(new JLabel(" "),c);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
}
或真实单元格(4,3),但超过3个组件且小于100:
public Form() {
getContentPane().setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.weightx = 1;
c.weighty = 1;
for(int i =0;i<2;i++){
getContentPane().add(new JLabel(" "),c);
c.gridx++;
}
for(int i =0;i<3;i++){
getContentPane().add(new JLabel(" "),c);
c.gridy++;
}
c.gridx = 3;
c.gridy = 4;
getContentPane().add(new JButton("btn"),c);
for(int i =0;i<7;i++){
getContentPane().add(new JLabel(" "),c);
c.gridx++;
}
for(int i =0;i<6;i++){
getContentPane().add(new JLabel(" "),c);
c.gridy++;
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
}