2017-10-16 61 views
1

问题:我无法控制更多的直方图包,所以我创建了一个按钮数组,并使用JLayeredPane将它们覆盖在直方图的顶部。但是,当JFrame放大或缩小时,我无法同时扩展直方图和按钮面板。 JLayedPane由2个JPanel组成,参见MWE。JLayeredPane with JPanel

重复该问题,运行程序并扩展JFrame。

我在SO贴子上看过以下内容; jlayeredpane-with-gridlayoutjlayeredpane-with-a-layoutmanagerjlayeredpane-not-resizing-with-jframeresize-jframe-to-jpanels-inside-jlayeredpaneautomatic-content-resizing-of-jlayeredpane, 以及其中有一些例子

,因为这些链接是有用的Oracle page on JLayeredPane,我仍然不能得到既JPanels延长与JFrame中/合同。

问题:有没有办法让JLayeredPane中的两个JPanel在没有实现新布局的情况下重新调整比例?如果需要新的布局,是否有人请提供MWE如何做到这一点?

public class FrameDemo extends JPanel { 

    private JLayeredPane layeredPane; 
    private final int width = 800; 
    private final int height = 800; 
    private String[] layerStrings = { "Yellow (0)", "Magenta (1)", "Cyan (2)", "Red (3)", "Green (4)", "Blue (5)" }; 
    private Color[] layerColors = { Color.yellow, Color.magenta, Color.cyan, Color.red, Color.green, Color.blue }; 

    public FrameDemo() { 
     setLayout(new BorderLayout()); 
     init(); 
     addPanels(); 
     add(layeredPane, BorderLayout.CENTER); 
    } 

    private void init() { 
     this.layeredPane = new JLayeredPane(); 
     this.layeredPane.setPreferredSize(new Dimension(width, height)); 
     this.layeredPane.setBorder(BorderFactory.createTitledBorder("Histogram should go here")); 
     this.layeredPane.setLayout(new BorderLayout()); 

    } 

    private void addPanels() { 
     this.layeredPane.add(createHistogramPanel(), BorderLayout.CENTER, new Integer(1)); 
     this.layeredPane.add(createButtonPanel(), BorderLayout.CENTER, new Integer(0)); 
     this.layeredPane.addComponentListener(new ComponentAdapter() { 
     @Override 
     public void componentResized(ComponentEvent e) { 
      Dimension size = layeredPane.getSize(); // get size 
      createHistogramPanel().setSize(size); // push size through 
      createButtonPanel().setSize(size); // push size trhough 
      // otherChildOfLayers.setSize(size); // push size trhough 
      layeredPane.revalidate(); // revalidate to see updates 
      layeredPane.repaint(); // "Always invoke repaint after 
            // revalidate" 
     } 
    }); 
    } 

    private JPanel createHistogramPanel() { 

     JPanel histpanel = new JPanel(); 

     histpanel.setLayout(new GridLayout(2, 3)); 
     for (int i = 0; i < layerStrings.length; i++) { 
      JLabel label = createColoredLabel(layerStrings[i], layerColors[i]); 
      histpanel.add(label); 
     } 
     histpanel.setOpaque(false); 
     histpanel.setBounds(10, 10, width, height); 
     return histpanel; 
    } 

    private JLabel createColoredLabel(String text, Color color) { 
     JLabel label = new JLabel(""); 
     label.setVerticalAlignment(JLabel.TOP); 
     label.setHorizontalAlignment(JLabel.CENTER); 
     label.setOpaque(true); 
     label.setBackground(color); 
     label.setForeground(Color.black); 
     label.setBorder(BorderFactory.createLineBorder(Color.black)); 
     label.setPreferredSize(new Dimension(120, 120)); 
     return label; 
    } 

    private JPanel createButtonPanel() { 
     ButtonGroup buttons = new ButtonGroup(); 

     JPanel buttonPanel = new JPanel(); 
     buttonPanel.setLayout(new GridLayout(2, 3)); 
     for (int i = 0; i < 6; i++) { 
      final int placer = i + 1; 
      JButton freshButton = new JButton(); 
      freshButton.addActionListener(e -> { 
       System.out.println("Button " + placer + " clicked"); 
      }); 

      freshButton.setText("Button " + (i + 1)); 
      freshButton.setOpaque(true); 
      freshButton.setContentAreaFilled(false); 
      freshButton.setBorderPainted(false); 
      freshButton.setBounds(new Rectangle(132, 75 + (i * 20), 40, 20)); 
      buttonPanel.add(freshButton, null); 
      buttons.add(freshButton); 

     } 
     buttonPanel.setOpaque(false); 

     buttonPanel.setBounds(10, 10, width, height); 
     return buttonPanel; 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("Testing"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JComponent newContentPane = new FrameDemo(); 
     newContentPane.setOpaque(true); // content panes must be opaque 
     frame.setContentPane(newContentPane); 
     frame.setLocationRelativeTo(null); 

     frame.pack(); 

     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

} 
+0

我会建议从你的问题中删除有关罐子的第一段和第一段。它没有增加任何理解具体问题。 –

+0

这看起来像在https://stackoverflow.com/questions/24522151/jlayeredpane-not-resizing-with-jframe中描述的相同的问题 正如你已经提到这一个,你的问题有什么不同? 建议用'componentResized'的侦听器更新大小的答案是否也适合您? –

+0

我曾在帖子中尝试过解决方案,即您提到的addComponentListener,但它并未解决问题。这就是为什么我没有将其纳入MWE。我编辑了我的MWE以显示此解决方案无效。 – mkunkel

回答

1

您的代码将无法工作,因为在componentResized你创建面板和应用规模给他们。您需要调整添加到分层窗格中的现有面板的大小。这可以通过分配histogramPanelbuttonPanel作为实例变量来完成。

+0

我也试着让它们成为实例变量,我有幸运用这种方式解决了这个问题。 – mkunkel