2015-11-03 30 views
2

我想利用现有的布局,如GridBagLayout实现以下电网系统为我的Java应用程序:摇摆 - 在一个JFrame多个布局结构

Layout

我设法创建一个类似的布局,但没有较小的按钮只使用GridBagLayout,但当我尝试添加这些较小的按钮时,它不工作,因为它不是相同的单元大小。

我认为解决方案可以通过向JFrame添加多个布局,每个布局代表全局布局的一部分,但我找不到要使用的正确布局。

是否有一个GridBagLayout可用于创建所有较大的方形部分,还有两个大的部分,一个包含左上角的项目,第二个包含以下8个较小的按钮?

谢谢。

+0

这一切都取决于你想要如何调整单元格大小。较小的4x2网格可以在它自己的容器中,这将简化问题 – MadProgrammer

+0

实际上整个JFrame不能调整大小,所以我可以将4x2网格放在另一个容器中而没有问题。 – AntoineB

回答

4

我在说的是“使用复合布局”,其中您使用一个或多个子容器来为特定区域执行特定的布局,并将这些容器与另一个布局组合到另一个容器中,像...

Layout

所以小4x2电网实际上是另一个JPanel这需要该区域的细节的照顾(和你很可能使用GridLayout),然后这个被并入大布局

import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setBackground(Color.BLACK); 
      setLayout(new GridBagLayout()); 

      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.fill = GridBagConstraints.BOTH; 
      gbc.weightx = 0.75; 
      gbc.weighty = 0.16; 
      gbc.gridwidth = 3; 
      gbc.insets = new Insets(4, 4, 4, 4); 
      add(makePanel(Color.DARK_GRAY), gbc); 

      gbc.weightx = 0.25; 
      gbc.gridx = 3; 
      gbc.gridwidth = 1; 
      add(makePanel(Color.ORANGE), gbc); 

      gbc.gridy++; 
      add(makePanel(Color.DARK_GRAY), gbc); 

      gbc.gridx = 0; 
      gbc.gridwidth = 3; 
      gbc.weightx = 0.75; 
      add(makeSmallerPane(), gbc); 

      gbc = new GridBagConstraints(); 
      gbc.weightx = 0.25; 
      gbc.insets = new Insets(4, 4, 4, 4); 
      gbc.weighty = 0.16; 
      gbc.fill = GridBagConstraints.BOTH; 
      for (int y = 2; y < 7; y++) { 
       gbc.gridx = y; 
       for (int x = 0; x < 4; x++) { 
        gbc.gridx = x; 
        Color color = Color.GRAY; 
        if (x == 3) { 
         color = Color.DARK_GRAY; 
        } 
        add(makePanel(color), gbc); 
       } 
      } 
     } 

     protected Component makePanel(Color color) { 
      JPanel panel = new JPanel(); 
      panel.setBackground(color); 
      return panel; 
     } 

     protected Component makeSmallerPane() { 
      JPanel panel = new JPanel(new GridBagLayout()); 
      panel.setOpaque(false); 
      panel.setLayout(new GridBagLayout());; 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.fill = GridBagConstraints.BOTH; 
      gbc.weightx = 0.25; 
      gbc.weighty = 0.5; 
      gbc.insets = new Insets(0, 0, 0, 4); 

      int topGap = 0; 
      int bottomGap = 4; 
      for (int y = 0; y < 2; y++) { 
       gbc.gridy = y; 
       for (int x = 0; x < 4; x++) { 
        gbc.gridx = x; 
        switch (x) { 
         case 0: 
          gbc.insets = new Insets(topGap, 0, bottomGap, 4); 
          break; 
         case 3: 
          gbc.insets = new Insets(topGap, 4, bottomGap, 0); 
          break; 
         default: 
          gbc.insets = new Insets(topGap, 4, bottomGap, 4); 
          break; 
        } 
        panel.add(makePanel(Color.DARK_GRAY), gbc); 
       } 
       topGap = 4; 
       bottomGap = 0; 
      } 

      return panel; 
     } 

    } 

} 
+0

非常感谢你,这几乎是我正在寻找的:)我遇到的唯一问题,并且在我的测试后我无法修复的事实是,面板下方的橙色面板在4x2右侧, 4x2面板的高度。如果可能的话,我希望4x2面板占据这个1x1面板的高度,这个高度应该是窗口右侧的其他面板的高度。我设法找到了合适的尺寸,但4x2面板保持不变,不适合。 – AntoineB

+0

在我的例子中,我对所有约16%的行给予了相同的高度(我认为它实际上应该是14%)。这不能保证,因为诸如组件的最小尺寸之类的其他事实可能在确定提供给该行的总高度方面起作用。此外,类似'fill'属性的东西也可能会产生影响 – MadProgrammer

+0

是的,我注意到了16%的高度(并将它改为14:P),但即使在您自己的屏幕截图中,您也可以看到此面板有更大的其他人的身高低于它。在我的情况下,我在面板内添加了按钮,差异更大。他们是一种避免这种情况的方法吗?它看起来像组件有一个默认的最小填充或类似的东西:/ – AntoineB

0

不是直接将按钮添加到JFrame中,而是将它们放入具有自己GridBagLayout的JPanel中,该GridBagLayout具有所需的单元大小。这样,您可以添加JPanel并将所需大小的按钮放在里面。