我使用GridBagLayout和GridBagConstraints设计了一个图形用户界面。它包含可变数量的行,每行都有几种可能的列布局之一。为了测试代码,我组成了具有不同颜色的面板的GUI,这些面板说明了每行和每列中所有单元格的位置和大小调整行为。这个测试GUI运行得很好,但是现在我需要自动构建它。具体来说,我需要这些行是三种不同类型中的一种。如果运行下面的代码并查看生成的图形用户界面,您可以看到row1是一种类型,第2,6行,and7是另一种类型,第3,4行,and5是第三种类型。我需要将这三种类型的行中的每一种都封装在它自己的类中。更重要的是,我需要我的代码能够创建数量可变的第三种类型的行(示例中的第3,4行,and5所示)。(这是针对数据分析软件的。这些面板将加载数据视图和用于操作数据视图的工具。)
当我试图将这些行封装到它们自己的类中时,GUI看起来就不像它应该是的样子了。下面的测试代码按照它应该看起来的方式生成一个GUI布局。谁能告诉我如何修改这段代码,使其具有上面第一段中描述的功能?
您只需将下面的测试代码粘贴到您的IDE中,即可立即使其正常工作。测试代码位于两个单独的文件中,如下所示:
GridBagLayoutDemo.java的代码是:
import java.awt.*;
import javax.swing.JFrame;
public class GridBagLayoutDemo {
final static boolean RIGHT_TO_LEFT = false;
public static void addComponentsToPane(Container pane) {
if (RIGHT_TO_LEFT) {pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);}
pane.setLayout(new GridBagLayout());
// top row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0)
TestPanel panelr1c1 = new TestPanel(Color.black);
GridBagConstraints constraint_r1c1 = getGridBagConstraints(GridBagConstraints.NONE,0,0,1,0,0,0);
pane.add(panelr1c1,constraint_r1c1);
TestPanel panelr1c2 = new TestPanel(Color.blue);
GridBagConstraints constraint_r1c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,0,1,0.8,0,0);
pane.add(panelr1c2,constraint_r1c2);
TestPanel panelr1c2a = new TestPanel(Color.green);
GridBagConstraints constraint_r1c2a = getGridBagConstraints(GridBagConstraints.HORIZONTAL,2,0,1,0.8,0,0);
pane.add(panelr1c2a,constraint_r1c2a);
TestPanel panelr1c3 = new TestPanel(Color.red);
GridBagConstraints constraint_r1c3 = getGridBagConstraints(GridBagConstraints.NONE,3,0,1,0,0,0);
pane.add(panelr1c3,constraint_r1c3);
TestPanel panelr1c4 = new TestPanel(Color.blue);
GridBagConstraints constraint_r1c4 = getGridBagConstraints(GridBagConstraints.NONE,4,0,1,0,0,0);
pane.add(panelr1c4,constraint_r1c4);
// second row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0)
TestPanel panelr2c1 = new TestPanel(Color.magenta);
GridBagConstraints constraint_r2c1 = getGridBagConstraints(GridBagConstraints.NONE,0,1,1,0,0,0);
pane.add(panelr2c1,constraint_r2c1);
TestPanel panelr2c2 = new TestPanel(Color.pink);
GridBagConstraints constraint_r2c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,1,2,1.0,0,0);
pane.add(panelr2c2,constraint_r2c2);
TestPanel panelr2c3 = new TestPanel(Color.black);
GridBagConstraints constraint_r2c3 = getGridBagConstraints(GridBagConstraints.NONE,3,1,1,0,0,0);
pane.add(panelr2c3,constraint_r2c3);
TestPanel panelr2c4 = new TestPanel(Color.pink);
GridBagConstraints constraint_r2c4 = getGridBagConstraints(GridBagConstraints.NONE,4,1,1,0,0,0);
pane.add(panelr2c4,constraint_r2c4);
// third row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0)
TestPanel panelr3c1 = new TestPanel(Color.gray);
GridBagConstraints constraint_r3c1 = getGridBagConstraints(GridBagConstraints.VERTICAL,0,2,1,0,0.5,40);
pane.add(panelr3c1,constraint_r3c1);
TestPanel panelr3c2 = new TestPanel(Color.orange);
GridBagConstraints constraint_r3c2 = getGridBagConstraints(GridBagConstraints.BOTH,1,2,2,1.0,0.5,40);
pane.add(panelr3c2,constraint_r3c2);
TestPanel panelr3c3 = new TestPanel(Color.red);
GridBagConstraints constraint_r3c3 = getGridBagConstraints(GridBagConstraints.VERTICAL,3,2,1,0,0.5,40);
pane.add(panelr3c3,constraint_r3c3);
TestPanel panelr3c4 = new TestPanel(Color.orange);
GridBagConstraints constraint_r3c4 = getGridBagConstraints(GridBagConstraints.VERTICAL,4,2,1,0,0.5,40);
pane.add(panelr3c4,constraint_r3c4);
// fourth row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0)
TestPanel panelr4c1 = new TestPanel(Color.black);
GridBagConstraints constraint_r4c1 = getGridBagConstraints(GridBagConstraints.VERTICAL,0,3,1,0,0.5,40);
pane.add(panelr4c1,constraint_r4c1);
TestPanel panelr4c2 = new TestPanel(Color.white);
GridBagConstraints constraint_r4c2 = getGridBagConstraints(GridBagConstraints.BOTH,1,3,2,1.0,0.5,40);
pane.add(panelr4c2,constraint_r4c2);
TestPanel panelr4c3 = new TestPanel(Color.green);
GridBagConstraints constraint_r4c3 = getGridBagConstraints(GridBagConstraints.VERTICAL,3,3,1,0,0.5,40);
pane.add(panelr4c3,constraint_r4c3);
TestPanel panelr4c4 = new TestPanel(Color.blue);
GridBagConstraints constraint_r4c4 = getGridBagConstraints(GridBagConstraints.VERTICAL,4,3,1,0,0.5,40);
pane.add(panelr4c4,constraint_r4c4);
// fifth row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0)
TestPanel panelr5c1 = new TestPanel(Color.darkGray);
GridBagConstraints constraint_r5c1 = getGridBagConstraints(GridBagConstraints.VERTICAL,0,4,1,0,0.5,40);
pane.add(panelr5c1,constraint_r5c1);
TestPanel panelr5c2 = new TestPanel(Color.yellow);
GridBagConstraints constraint_r5c2 = getGridBagConstraints(GridBagConstraints.BOTH,1,4,2,1.0,0.5,40);
pane.add(panelr5c2,constraint_r5c2);
TestPanel panelr5c3 = new TestPanel(Color.white);
GridBagConstraints constraint_r5c3 = getGridBagConstraints(GridBagConstraints.VERTICAL,3,4,1,0,0.5,40);
pane.add(panelr5c3,constraint_r5c3);
TestPanel panelr5c4 = new TestPanel(Color.orange);
GridBagConstraints constraint_r5c4 = getGridBagConstraints(GridBagConstraints.VERTICAL,4,4,1,0,0.5,40);
pane.add(panelr5c4,constraint_r5c4);
// sixth row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0)
TestPanel panelr6c1 = new TestPanel(Color.green);
GridBagConstraints constraint_r6c1 = getGridBagConstraints(GridBagConstraints.NONE,0,5,1,0,0,0);
pane.add(panelr6c1,constraint_r6c1);
TestPanel panelr6c2 = new TestPanel(Color.blue);
GridBagConstraints constraint_r6c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,5,2,1.0,0,0);
pane.add(panelr6c2,constraint_r6c2);
TestPanel panelr6c3 = new TestPanel(Color.red);
GridBagConstraints constraint_r6c3 = getGridBagConstraints(GridBagConstraints.NONE,3,5,1,0,0,0);
pane.add(panelr6c3,constraint_r6c3);
TestPanel panelr6c4 = new TestPanel(Color.black);
GridBagConstraints constraint_r6c4 = getGridBagConstraints(GridBagConstraints.NONE,4,5,1,0,0,0);
pane.add(panelr6c4,constraint_r6c4);
// seventh row (fill, gridx, gridy, gridwidth 1, weightx 0, weighty 0, ipady 0)
TestPanel panelr7c1 = new TestPanel(Color.darkGray);
GridBagConstraints constraint_r7c1 = getGridBagConstraints(GridBagConstraints.NONE,0,6,1,0,0,0);
pane.add(panelr7c1,constraint_r7c1);
TestPanel panelr7c2 = new TestPanel(Color.white);
GridBagConstraints constraint_r7c2 = getGridBagConstraints(GridBagConstraints.HORIZONTAL,1,6,2,1.0,0,0);
pane.add(panelr7c2,constraint_r7c2);
TestPanel panelr7c3 = new TestPanel(Color.yellow);
GridBagConstraints constraint_r7c3 = getGridBagConstraints(GridBagConstraints.NONE,3,6,1,0,0,0);
pane.add(panelr7c3,constraint_r7c3);
TestPanel panelr7c4 = new TestPanel(Color.green);
GridBagConstraints constraint_r7c4 = getGridBagConstraints(GridBagConstraints.NONE,4,6,1,0,0,0);
pane.add(panelr7c4,constraint_r7c4);
}
// Create the GUI and show it. For thread safety, this method should be invoked from the event-dispatching thread.
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("GridBagConstraint Practice");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
addComponentsToPane(frame.getContentPane());
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread: creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {public void run() {createAndShowGUI();}});
}
private static GridBagConstraints getGridBagConstraints(int fill, int gridx, int gridy, int gridwidth, double weightx, double weighty, int ipady){
GridBagConstraints myGridBagConstraints = new GridBagConstraints();
myGridBagConstraints.fill=fill;
myGridBagConstraints.gridx=gridx;
myGridBagConstraints.gridy=gridy;
myGridBagConstraints.gridwidth=gridwidth;
myGridBagConstraints.weightx=weightx;
myGridBagConstraints.weighty=weighty;
myGridBagConstraints.ipady=ipady;
return myGridBagConstraints;
}
}TestPanel.java的代码是:
import java.awt.Color;
import javax.swing.JPanel;
public class TestPanel extends JPanel {
public TestPanel (Color myColor){this.setBackground(myColor);}
}发布于 2011-09-22 19:44:24
Swing布局的第一条规则:无论你做什么,都不要使用GridBagLayout。1998年,GridBagLayout还不错。它的设计是有问题的,它有buggy,而且还没有进化。代码非常冗长,很难写,很难理解,也很难维护。
我推荐MigLayout,它是我见过的最通用、最直观的布局管理器。看看MigLayout站点上的快速入门指南,它比GridBagLayout简单得多,而且功能强大得多。下面是您在MigLayout中的示例,我向您展示了如何重构您的行类型:
import net.miginfocom.swing.MigLayout;
import java.awt.*;
import javax.swing.*;
public class GridBagLayoutDemo {
final static boolean RIGHT_TO_LEFT = false;
public static void addComponentsToPane(Container pane) {
if (RIGHT_TO_LEFT) {
pane.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
}
pane.setLayout(new MigLayout("insets 0, gap 0, wrap", "[][fill, grow][fill, grow][][]", "[fill]"));
addType1(pane, Color.BLACK, Color.BLUE, Color.GREEN, Color.RED, Color.BLUE);
addType2(pane, Color.MAGENTA, Color.PINK, Color.BLACK, Color.PINK);
addType3(pane, Color.GRAY, Color.ORANGE, Color.RED, Color.ORANGE);
addType3(pane, Color.BLACK, Color.WHITE, Color.GREEN, Color.BLUE);
addType3(pane, Color.DARK_GRAY, Color.YELLOW, Color.WHITE, Color.ORANGE);
addType2(pane, Color.GREEN, Color.BLUE, Color.RED, Color.BLACK);
addType2(pane, Color.DARK_GRAY, Color.WHITE, Color.YELLOW, Color.GREEN);
}
private static void addType1(Container pane, Color c1, Color c2, Color c3, Color c4, Color c5) {
pane.add(new TestPanel(c1));
pane.add(new TestPanel(c2));
pane.add(new TestPanel(c3));
pane.add(new TestPanel(c4));
pane.add(new TestPanel(c5));
}
private static void addType2(Container pane, Color c1, Color c2, Color c3, Color c4) {
pane.add(new TestPanel(c1));
pane.add(new TestPanel(c2), "spanx 2");
pane.add(new TestPanel(c3));
pane.add(new TestPanel(c4));
}
private static void addType3(Container pane, Color c1, Color c2, Color c3, Color c4) {
pane.add(new TestPanel(c1));
pane.add(new TestPanel(c2), "spanx 2, pushy, hmin pref+40");
pane.add(new TestPanel(c3));
pane.add(new TestPanel(c4));
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("MigLayout Practice");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addComponentsToPane(frame.getContentPane());
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
class TestPanel extends JPanel {
public TestPanel(Color myColor) {
this.setBackground(myColor);
}
}这将产生与您的示例完全相同的布局。您可能需要hmin 40而不是hmin pref+40,后者产生的结果与在GridBagConstraints中设置ipady=40的结果相同。
并且请在Color类中使用大写常量,小写常量真的应该被弃用。
对于任何想知道这个布局是什么样子的人来说,这里就是:

https://stackoverflow.com/questions/7509781
复制相似问题