web-dev-qa-db-ja.com

Java Swing-別のパネルの上にパネルを表示する方法は?

メンバーの入力を求めるための内部(ウィンドウではない)ダイアログが必要です。ダイアログを既存のJPanelの中​​央に配置したいと思います。

layeredpanes を見てきましたが、これらはすべてのペインに単一のレイアウトマネージャー(またはレイアウトマネージャーなし)があるため、使用できないようです。 JLayeredPaneをオーバーライドしてカスタムレイアウトを提供しようとすることはできますが、これは極端に思えます。

ガラスペイン も適切ではないようです。

これをどのように行うことができますか? SwingにはZインデックスの概念はありませんか?

[〜#〜] edit [〜#〜]

レイヤードペインが適切でない理由は、レイヤーごとのレイアウトマネージャーが不足しているためです。パネルはサイズ変更可能で、パネルAは面積の100%に、パネルBは中央に配置する必要があります。

31
Pool

ここでは、LayeredPaneが最善の策だと思います。ただし、AとBを含めるには3番目のパネルが必要です。この3番目のパネルはlayeredPaneになり、その後パネルAとBにはNice LayoutManagersを含めることができます。あなたがしなければならないのは、Aの上にセンターBがあり、これを行う方法に関するSwingトレイルには非常に多くの例があります。 LayoutManagerを使用しない位置決めのチュートリアル

public class Main {
    private JFrame frame = new JFrame();
    private JLayeredPane lpane = new JLayeredPane();
    private JPanel panelBlue = new JPanel();
    private JPanel panelGreen = new JPanel();
    public Main()
    {
        frame.setPreferredSize(new Dimension(600, 400));
        frame.setLayout(new BorderLayout());
        frame.add(lpane, BorderLayout.CENTER);
        lpane.setBounds(0, 0, 600, 400);
        panelBlue.setBackground(Color.BLUE);
        panelBlue.setBounds(0, 0, 600, 400);
        panelBlue.setOpaque(true);
        panelGreen.setBackground(Color.GREEN);
        panelGreen.setBounds(200, 100, 100, 100);
        panelGreen.setOpaque(true);
        lpane.add(panelBlue, new Integer(0), 0);
        lpane.add(panelGreen, new Integer(1), 0);
        frame.pack();
        frame.setVisible(true);
    }


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Main();
    }

}

SetBoundsを使用して、レイヤードペイン内にパネルを配置し、サイズを設定します。

元の投稿への変更を反映するための編集親コンテナのサイズが変更されていることを検出し、パネルAとBの境界を動的に変更するコンポーネントリスナーを追加する必要があります。

36

そこにisを追加すると思いました。SwingのZオーダーの概念です。[Java.awt.Component#setComponentZOrder] [1 ]

これは、親コンポーネント配列内のコンポーネントの位置に影響し、ペイントの順序を決定します。

javax.swing.JComponent#isOptimizedDrawingEnabled をオーバーライドして、親コンテナでfalseを返し、重複するコンポーネントを正しく再描画する必要があることに注意してください。 (JComponentsは、isOptimizedDrawingEnabledがfalseを返さない限り、重複する子がないと想定します)

[1]: http://Java.Sun.com/j2se/1.5.0/docs/api/Java/awt/Container.html#setComponentZOrder(Java.awt.Component 、int)

5
CarlG

次のように、装飾のないJDialogを追加できます。

import Java.awt.event.*;

import javax.swing.*;

public class TestSwing {
  public static void main(String[] args) throws Exception {
    JFrame frame = new JFrame("Parent");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800, 600);
    frame.setVisible(true);

    final JDialog dialog = new JDialog(frame, "Child", true);    
    dialog.setSize(300, 200);
    dialog.setLocationRelativeTo(frame);
    JButton button = new JButton("Button");
    button.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        dialog.dispose();
      }
    });
    dialog.add(button);
    dialog.setUndecorated(true);
    dialog.setVisible(true);
  }
}
4
mavroprovato

既存のJPanelで1行1列のGridLayoutを使用し、そのJPanelにパネルを追加します。 1 x 1のGridLayoutの唯一の問題は、JPanelに他のアイテムを配置できないことです。この場合、適切なレイアウトを把握する必要があります。使用する各パネルは独自のレイアウトを使用できるため、問題はありません。

この質問を正しく理解していますか?

1
AlbertoPL

JOptionPane.showInternalInputDialogはおそらくあなたが望むことをします。そうでない場合は、不足しているものを理解することが役立ちます。

1
Yishai

ここに興味があるかもしれない別のレイアウトマネージャがあります: オーバーレイレイアウト ここに簡単なチュートリアルがあります: オーバーレイレイアウト:互いの上にあるコンポーネントのレイアウト管理用 。オーバーレイレイアウトを使用すると、パネルを上下に配置し、各パネル内にレイアウトを設定できます。各パネルのサイズと位置を個別に設定することもできます。

(私が何年も前にこの質問に答えているのは、同じ問題に出くわしたためです。StackOverflowのオーバーレイレイアウトに関する言及はほとんどありませんが、十分に文書化されているようです。それを探し続ける他の人。)

0
AgataB