2014-03-26 28 views
0

对不起,另一个“我的代码在这里有什么问题”的问题,但我一直在与这个GridBagOfHurtLayout战斗,我不明白什么可能发生。GridBagLayout对齐列它不应该

我希望做一个UI,像这样的布局:

What it should be

的画图程序崩溃和所有我得到的是一个缩小的屏幕截图,遗憾的颗粒感。所以我看到它的方式,我想要一个带有4列的GridBagLayout,每个顶部的两个窗格跨越2列,文本字段和大窗格跨越3,搜索按钮和左下方的窗格跨越1(水平)。这是我的代码:

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
this.setPreferredSize(new Dimension(1080, 720)); 

this.setLayout(new GridBagLayout()); 
GridBagConstraints constraints; 

projectLabel = new JLabel("Projects"); 
constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.NONE; 
constraints.anchor = GridBagConstraints.LINE_START; 
constraints.gridx = 0; 
constraints.gridy = 0; 
constraints.gridwidth = 2; 
constraints.weightx = 0.25; 
constraints.weighty = 0; 
constraints.insets = new Insets(4,4,4,4); 
this.add(projectLabel); 

projectScrollPane = new JScrollPane(); 
constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.BOTH; 
constraints.gridx = 0; 
constraints.gridy = 1; 
constraints.gridwidth = 2; 
constraints.weightx = 1.0; 
constraints.weighty = 0.5; 
constraints.insets = new Insets(4,4,4,4); 
projectScrollPane.setPreferredSize(new Dimension(540, 240)); 
this.add(projectScrollPane,constraints); 

fieldLabel = new JLabel("Fields"); 
constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.NONE; 
constraints.anchor = GridBagConstraints.LINE_START; 
constraints.gridx = 2; 
constraints.gridy = 0; 
constraints.gridwidth = 2; 
constraints.weightx = 1.0; 
constraints.weighty = 0; 
constraints.insets = new Insets(4,4,4,4); 
this.add(fieldLabel); 

fieldScrollPane = new JScrollPane(); 
constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.BOTH; 
constraints.gridx = 2; 
constraints.gridy = 1; 
constraints.gridwidth = 2; 
constraints.weightx = 1.0; 
constraints.weighty = 0.5; 
constraints.insets = new Insets(4,4,4,4); 
fieldScrollPane.setPreferredSize(new Dimension(540, 240)); 
this.add(fieldScrollPane,constraints); 

searchTextField = new JTextField(); 
constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.HORIZONTAL; 
constraints.gridx = 0; 
constraints.gridy = 2; 
constraints.gridwidth = 3; 
constraints.weightx = 2.0; 
constraints.weighty = 0.0; 
constraints.insets = new Insets(4,4,4,4); 
searchTextField.setPreferredSize(new Dimension(1000,30)); 
this.add(searchTextField,constraints); 

searchButton = new JButton("Search"); 
constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.NONE; 
constraints.gridx = 3; 
constraints.gridy = 2; 
constraints.weightx = 0.0; 
constraints.weighty = 0.0; 
constraints.insets = new Insets(4,4,4,4); 
searchButton.setSize(new Dimension(80,30)); 
this.add(searchButton,constraints); 

imageScrollPane = new JScrollPane(); 
constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.BOTH; 
constraints.gridx = 0; 
constraints.gridy = 3; 
constraints.weightx = 0.25; 
constraints.weighty = 1.0; 
constraints.insets = new Insets(4,4,4,4); 
imageScrollPane.setPreferredSize(new Dimension(360,810)); 
this.add(imageScrollPane,constraints); 

imagePane = new JEditorPane(); 
constraints = new GridBagConstraints(); 
constraints.fill = GridBagConstraints.BOTH; 
constraints.gridx = 1; 
constraints.gridy = 3; 
constraints.gridwidth = 3; 
constraints.weightx = 1.0; 
constraints.weighty = 1.0; 
constraints.insets = new Insets(4,4,4,4); 
imagePane.setPreferredSize(new Dimension(720,810)); 
this.add(imagePane,constraints); 

this.pack(); 

标签不在原始布局中。每个ScrollPanes最终都会包含一个JList,但现在我只是试图让空白的布局看起来不错,而不是。我目前得到的是这个。

What I actually get

文本字段不能被说服占用3列,也许第一滚动窗格占用3.我试图改变它的每一个方式,我能想到的,但什么也没有帮助。我可能会放弃这一点,并使用BoxLayout进行嵌套面板,但我想知道为什么这不起作用,因为我认为我做的都是正确的。任何见解?提前致谢。

回答

2

Swing在这里感到困惑,因为它并没有真正引用列应该在哪里。

在这种情况下,最好的解决方案是创建至少一个包含所有列的行,并在这些列上定义weightx。

此外,JEditorPane在gridBagLayout中不能正常工作。您应该使用JScrollPane(或其他)并将JEditorPane放在此窗格中。

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setPreferredSize(new Dimension(1080, 720)); 

    this.setLayout(new GridBagLayout()); 
    GridBagConstraints constraints; 

    JLabel a = new JLabel(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 0; 
    constraints.gridy = 0; 
    constraints.weightx=0.25; 
    constraints.insets = new Insets(4,4,4,4); 
    this.add(a,constraints); 

    JLabel b = new JLabel(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 1; 
    constraints.gridy = 0; 
    constraints.weightx=0.25; 
    this.add(b,constraints); 

    JLabel c = new JLabel(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 2; 
    constraints.gridy = 0; 
    constraints.weightx=0.5; 
    constraints.insets = new Insets(4,4,4,4); 
    this.add(c,constraints); 

    JLabel d = new JLabel(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 3; 
    constraints.gridy = 0; 
    constraints.weightx=0; 
    this.add(d,constraints); 

    JLabel p1 = new JLabel("Project - 1"); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 0; 
    constraints.gridy = 0; 
    constraints.gridwidth=2; 
    constraints.insets = new Insets(4,4,4,4); 
    this.add(p1,constraints); 

    JLabel p2 = new JLabel("Project - 2"); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 2; 
    constraints.gridy = 0; 
    constraints.gridwidth=2; 
    constraints.insets = new Insets(4,4,4,4); 
    this.add(p2,constraints); 


    JScrollPane projectScrollPane = new JScrollPane(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 0; 
    constraints.gridy = 1; 
    constraints.gridwidth = 2; 
    constraints.weighty=1; 
    constraints.insets = new Insets(4,4,4,4); 
    this.add(projectScrollPane,constraints); 

    JScrollPane fieldScrollPane = new JScrollPane(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 2; 
    constraints.gridy = 1; 
    constraints.gridwidth = 2; 
    constraints.insets = new Insets(4,4,4,4); 
    fieldScrollPane.setPreferredSize(new Dimension(540, 240)); 
    this.add(fieldScrollPane,constraints); 

    JTextField searchTextField = new JTextField(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.HORIZONTAL; 
    constraints.gridx = 0; 
    constraints.gridy = 2; 
    constraints.gridwidth = 3; 
    constraints.insets = new Insets(4,4,4,4); 
    searchTextField.setPreferredSize(new Dimension(1000,30)); 
    this.add(searchTextField,constraints); 

    JButton searchButton = new JButton("Search"); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.NONE; 
    constraints.anchor = GridBagConstraints.LINE_END; 
    constraints.gridx = 3; 
    constraints.gridy = 2; 
    constraints.insets = new Insets(4,4,4,4); 
    searchButton.setSize(new Dimension(80,30)); 
    this.add(searchButton,constraints); 

    JScrollPane imageScrollPane = new JScrollPane(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 0; 
    constraints.gridy = 3; 
    constraints.insets = new Insets(4,4,4,4); 
    constraints.weighty=1; 
    this.add(imageScrollPane,constraints); 

    JScrollPane imagePane = new JScrollPane(); 
    constraints = new GridBagConstraints(); 
    constraints.fill = GridBagConstraints.BOTH; 
    constraints.gridx = 1; 
    constraints.gridy = 3; 
    constraints.gridwidth = 3; 
    constraints.weighty=1; 
    constraints.insets = new Insets(4,4,4,4); 
    this.add(imagePane,constraints); 

    this.pack(); 
+0

谢谢,这解决了这个问题。我无法让Project JLabels工作(代码中有一个错字,顺便说一下,它们不应该是相同的)。我最终把他们带走了,因为他们大多在那里试图去做那些看不见的标签。我也最终取消了他们的插页,并且我将第3栏的重量改为0.45,因为Search JButton是不平衡的东西。总之,不可见的行列固定列和所有其他权重约束是不需要的。我不明白为什么这些项目标签是用来填满单元格的,但他们已经不在了。谢谢! – krs013