3

皆さん、こんばんは、

Java Swingに解決できない問題があります。おそらく、あなたが私を助けてくれるでしょう。ここにあります:

  • BorderLayoutを使用するJFrameが1つと、多くのJPanelsがあります。
  • 新しい画面を表示する必要があるたびに(つまり、メインメニューから、[検索]ボタンをクリックすると、[検索メニュー]に移動します)、中央にあるコンポーネント(JPanel)を削除して、新しい画面を表示します。 (新しいJPanel)代わりに中央に。
  • このように、新しい画面を表示するたびにすべてのヘッダーオブジェクトとフッターオブジェクトを呼び出すわけではありません。

この小さな問題を除いて、このシステムではすべてが正常に機能します。新しいJPanelを作成するか、既存のJPanelに戻すたびに(一般的には、JPanelが表示されるたびに)いくつかのメソッドをトリガーしたいと思います。

そのために、ComponentListenerのcomponentShown(ComponentEvent e)メソッドを実装しようとし、JFrameの中央に配置したJPanelにComponentListenerを追加しましたが、機能しませんでした。この後、調査を行ったところ、このcomponentShown(@ComponentListener)メソッドは、JPanelの表示が変更された場合(非表示から表示またはその逆)にのみ機能することがわかりました。残念ながら、私はJPanelの表示を変更するのではなく、JPanelを別のJPanelに置き換えるだけです。つまり、現在のJPanelを削除し、新しいJPanelを追加します。以下のコードは、JPanelsを置き換える方法を示しています。

// Get the JPanel located in the center of our JFrame
JPanel currentView = (JPanel) myFrame.getContentPane().getComponent( 2 );

if ( currentView != null )
{
   // Remove it from the JPanel         
   myFrame.getContentPane().remove( currentView );
}

// Add the new JPanel    
myFrame.getContentPane().add( otherView, BorderLayout.CENTER );

// Pack the JFrame and show it
myFrame.pack();

これが私が持っているものです。手伝っていただければ幸いです。

4

2 に答える 2

2

@Jeffreyからのアドバイスを聞くことを強くお勧めしますが、この設計を続行する場合は、ContainerListenerインターフェイスの実装が役立つ可能性があります。

疑問がある場合は、APIを参照してください。

于 2012-04-07T02:28:25.923 に答える
2

比較のために、この問題はHierarchyListenerに対応していると思います

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ContainerListener extends JFrame {

    private static final long serialVersionUID = 1L;

    public ContainerListener() {
        super("Test");
        setContentPane(new TestPanel());
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] parameters) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ContainerListener containerListener = new ContainerListener();
            }
        });
    }

    private class TestPanel extends JPanel {

        private static final long serialVersionUID = 1L;

        TestPanel() {
            setLayout(new FlowLayout(FlowLayout.LEFT));
            add(new JButton(new AbstractAction("Add label") {

                private static final long serialVersionUID = 1L;
                private int n = 0;

                @Override
                public void actionPerformed(ActionEvent event) {
                    TestPanel.this.add(new JLabel("Label " + ++n));
                    validate();
                }
            }));
            addHierarchyListener(new HierarchyListener() {

                @Override
                public void hierarchyChanged(HierarchyEvent e) {
                    System.out.println("Components Change: " + e.getChanged());
                    if ((e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {
                        if (e.getComponent().isDisplayable()) {
                            System.out.println("Components: " + e.getChanged());
                        } else {
                            System.out.println("Components: " + e.getChanged());
                        }
                    }
                }
            });
            addContainerListener(new ContainerAdapter() {

                @Override
                public void componentAdded(ContainerEvent event) {
                    System.out.println("componentAdded : " + event.getChild() + "containerName" + " was added");
                }
            });

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    }
}
于 2012-04-07T07:55:16.417 に答える