Java Swing - パネルを別のパネルの上に表示するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/852631

質問

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

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

ガラス板 それも適切ではないようです。

これはどうすればできるのでしょうか?Swing には Z インデックスの使用可能な概念はないのでしょうか?

編集

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

役に立ちましたか?

解決

ここでは LayeredPane が最適だと思います。ただし、A と B を含めるには 3 番目のパネルが必要になります。この 3 番目のパネルは、layeredPane になり、パネル A と B には依然として優れた LayoutManager が含まれる可能性があります。あなたがしなければならないことは、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 の境界を動的に変更するコンポーネント リスナーを追加する必要があります。

他のヒント

そこにそれを追加しようと思ったところです スイングの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, 、整数)

次のように装飾されていない 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);
  }
}

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

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

JOptionPane.showInternalInputDialog はおそらくあなたが望むことを実行します。そうでない場合は、何が欠けているかを理解するのに役立ちます。

ここには興味深いレイアウト マネージャーがもう 1 つあります。 オーバーレイレイアウト簡単なチュートリアルは次のとおりです。 オーバーレイレイアウト:重なり合うコンポーネントのレイアウト管理用。オーバーレイ レイアウトを使用すると、パネルを互いに重ねて配置したり、各パネル内にレイアウトを設定したりできます。各パネルのサイズと位置を個別に設定することもできます。

(私が何年も前のこの質問に答えている理由は、私も同じ問題に遭遇したことがあり、StackOverflow でオーバーレイ レイアウトに関する言及をほとんど見たことがなかったためです。ただし、それはかなり詳しく文書化されているようです。これが、それを探し続けている他の人の助けになれば幸いです。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top