2017-10-16 7 views
1

問題:私はヒストグラムパッケージにもっと多くの実装をコントロールしていないので、ボタンの配列を作成し、JLayeredPaneを使ってヒストグラムの上にオーバーレイします。しかし、ヒストグラムプロットとボタンパネルの両方を、JFrameを拡大または縮小したときに拡大することはできません。 JLayedPaneは2つのJPanelで構成されています(MWEを参照)。JPanelを使用したJLayeredPane

この問題を繰り返すには、programを実行してJFrameを拡張してください。

私は次の記事を読んでいます。 jlayeredpane-with-gridlayoutjlayeredpane-with-a-layoutmanagerjlayeredpane-not-resizing-with-jframeresize-jframe-to-jpanels-inside-jlayeredpaneautomatic-content-resizing-of-jlayeredpane、 だけでなく、いくつかの例

これらのリンクがあったようとして有用なを持っているOracle page on JLayeredPane、私はまだ両方のJPanelは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

質問から最初の段落とjarに関する段落を削除することをお勧めします。特定の問題を理解するために何も追加しません。 –

+0

これは、https://stackoverflow.com/questions/24522151/jlayeredpane-not--with-jframe に記載されているのと同じ問題のようです。 'componentResized'のリスナーでサイズを更新することを提案した答えは、あなたにとっても適切な解決策でしょうか? –

+0

私は記事の解決策、つまりaddComponentListenerを試しましたが、問題は解決しませんでした。それが私がMWEにそれを含めなかった理由です。私はこのソリューションが動作しないことを示すためにMWEを編集しました。 – mkunkel

答えて

1

componentResizedにあなたが新しいパネルを作成しているし、それらにサイズを適用するので、あなたのコードは動作しません。レイヤーペインに追加されたの既存のパネルのサイズを変更する必要があります。これは、インスタンス変数としてhistogramPanelbuttonPanelを割り当てることで可能です。

+0

私はそれらにインスタンス変数を作ろうとしましたが、私はその方法で問題を解決しました。 – mkunkel

関連する問題