-1

JDialogに追加するときに、JLayeredPaneにコンポーネントを表示できません。

また、これが適度なサイズのコードブロックで実行される可能性があることを示すWebリソースを見つけることができませんでした。すべての視力ivは、これを行うことができる「主張」を見て、それから嫌なほど長い解決策を示します。

私が欲しいのは、JLayeredペインにボタンを追加し、アイコン付きのJLabelをこのペインにも配置することです。英語では、テキストの前にアイコンが付いたボタンが必要です。

システムがスイングJButtonに見えるようにする方法を見つけることができなかったので、それはawtボタンです。

編集:もう少し具体的なことで私を助けてくれませんか。私は自分のポストで漠然としていたと思います。

Button button = new Button("ok");
JDialog dialog = new JDialog(null,"Windows",Dialog.ModalityType.APPLICATION_MODAL);
dialog.getLayeredPane().add(button);
dialog.pack();
dialog.setVisible(true);
4

2 に答える 2

4

問題ないようです...

public class TestLayeredDialog {

    public static void main(String[] args) {
        new TestLayeredDialog();
    }

    public TestLayeredDialog() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JDialog dialog = new JDialog();
                dialog.setModal(true);
                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                dialog.setLayout(new BorderLayout());
                dialog.add(new MyContent());
                dialog.pack();
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);

                System.exit(0);
            }
        });
    }

    public class MyContent extends JLayeredPane {

        public MyContent() {
            JLabel label = new JLabel("Hello new world");
            label.setSize(label.getPreferredSize());
            label.setLocation(0, 0);
            add(label);

            Dimension size = getPreferredSize();

            JButton button = new JButton("Click me");
            button.setSize(button.getPreferredSize());
            button.setLocation(size.width - button.getWidth(), size.height - button.getHeight());
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    SwingUtilities.getWindowAncestor(MyContent.this).dispose();
                }
            });
            add(button);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}

JLayeredPaneレイアウトマネージャーがないことを忘れないでください。子コンポーネントのサイズと位置を管理する責任があります。それがポイントです。

新しい例で更新

ここに画像の説明を入力してください

public class TestLayeredDialog {

    public static void main(String[] args) {
        new TestLayeredDialog();
    }

    public TestLayeredDialog() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JDialog dialog = new JDialog();
                dialog.setModal(true);
                dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                dialog.setLayout(new BorderLayout());

                JLabel label = new JLabel("Hello new world");
                label.setSize(label.getPreferredSize());
                label.setLocation(0, 0);
                dialog.getLayeredPane().add(label, new Integer(1));

                dialog.setSize(100, 100);
                dialog.setLocationRelativeTo(null);
                dialog.setVisible(true);

                System.exit(0);
            }
        });
    }
}

の階層化されたペインは、JRootPane(とりわけ)コンテンツペインとメニューバーのレイアウトを担当します。また、ポップアップなどを表示するためにも使用されます(場合によっては)。

ここに画像の説明を入力してください

ルートペインの使用方法をお読みください

ルートペインの階層化ペインにコンポーネントを配置することを選択できます。その場合、特定の深さが特定の機能に使用されるように定義されていることに注意する必要があります。また、意図したとおりに深さを使用する必要があります。そうしないと、コンポーネントが他のコンポーネントとうまく機能しない可能性があります。これは、機能レイヤーとそれらの関係を示す図です。

これを使用すると、すでに画面に表示されているコンポーネントと競合していることを意味します。

このコンポーネントをいじる正当な理由がない限り、1-将来変更される可能性があり(コンポーネントのレイヤー位置)、2-使用される他のコンポーネントと干渉する可能性があるため、避けることをお勧めします。 Swing API

于 2012-11-29T23:42:55.693 に答える
4

このは、コンストラクターに追加された次の行で機能するようです。

this.addMouseListener(new MouseHandler(this));
this.add(new JLabel("Label"));
this.add(new JButton(UIManager.getIcon("html.pendingImage")));

ここに画像の説明を入力してください

于 2012-11-29T23:36:27.540 に答える