34

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

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

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

これはどのように行うことができますか?Swing に使用可能な z-indexes の概念はありませんか?

編集

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

4

6 に答える 6

38

ここでは LayeredPane が最善の策だと思います。ただし、A と B を含めるには 3 番目のパネルが必要です。この 3 番目のパネルは layeredPane であり、パネル A と B は引き続き適切な LayoutManagers を持つことができます。あなたがしなければならないのは、B を A の上に置くことだけです。これを行う方法については、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 の境界を動的に変更する必要があります。

于 2009-05-12T13:28:14.197 に答える
5

次のように、装飾されていない 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);
  }
}
于 2009-05-12T14:11:46.463 に答える
5

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)

于 2009-05-13T16:15:13.517 に答える
1

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

于 2009-05-12T13:16:31.680 に答える
1

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

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

于 2009-05-12T13:04:18.837 に答える
0

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

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

于 2016-07-21T08:40:32.043 に答える