問題:私はヒストグラムパッケージにもっと多くの実装をコントロールしていないので、ボタンの配列を作成し、JLayeredPaneを使ってヒストグラムの上にオーバーレイします。しかし、ヒストグラムプロットとボタンパネルの両方を、JFrameを拡大または縮小したときに拡大することはできません。 JLayedPaneは2つのJPanelで構成されています(MWEを参照)。JPanelを使用したJLayeredPane
この問題を繰り返すには、programを実行してJFrameを拡張してください。
私は次の記事を読んでいます。 jlayeredpane-with-gridlayout、jlayeredpane-with-a-layoutmanager、jlayeredpane-not-resizing-with-jframe、resize-jframe-to-jpanels-inside-jlayeredpane、automatic-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();
}
});
}
}
質問から最初の段落とjarに関する段落を削除することをお勧めします。特定の問題を理解するために何も追加しません。 –
これは、https://stackoverflow.com/questions/24522151/jlayeredpane-not--with-jframe に記載されているのと同じ問題のようです。 'componentResized'のリスナーでサイズを更新することを提案した答えは、あなたにとっても適切な解決策でしょうか? –
私は記事の解決策、つまりaddComponentListenerを試しましたが、問題は解決しませんでした。それが私がMWEにそれを含めなかった理由です。私はこのソリューションが動作しないことを示すためにMWEを編集しました。 – mkunkel