1

私が自分のプログラムに取り込もうとしている概念は、基本的に次のとおりです。

-メイン ウィンドウ: プログラムのメイン フレームを保持するメイン クラス。

public class MainWindow extends JFrame {
    ...
}

-その他のクラス: JPanel を拡張して、1 つのオブジェクトまたはエンティティとして MainWindow に簡単に追加できるようにするクラス。

public class SomePanel extends JPanel {
    ...
}

このように、メインウィンドウについて次のように言えます。

public MainWindow() {
...
SomePanel sp = new SomePanel();
add(sp);
...
}

ActionEvent がトリガーされると、MainWindow クラスで次のように言えます。

// remove the current panel
getContentPane().remove(sp);
// insert the new panel
getContentPane().add(someOtherPanel);
validate();
repaint();

コンセプトは CardLayout に似ていると思いますが、私はまだ CardLayout を学んでおらず、代わりにこのコンセプトを試してみたいと思いました。どちらが簡単かにもよりますが、私はおそらくある時点で CardLayout を学ぶでしょう。

しかし、私の主な質問は、すべてが異なるクラスにある場合、ActionEvent のトリガーに基づいて、JPanels をそのようにリモートで切り替えるにはどうすればよいかということです。クラス間に共有コンポーネントが必要だと思いましたが、これは機能していないようです。私は正しい軌道に乗っていますか?

コンポーネントのActionEventをトリガーしても何も変わらないため(リスナーが追加され、すべてが)、remove()およびadd()で試しているコードは機能していないようです。validate() と repaint() も含めていますが、それでも何も起こりません。

私はもはや初心者ではありませんが、信じられないほど経験豊富でもありません。助けてくれてありがとう。

4

3 に答える 3

7

あなたは間違いなく正しい軌道に乗っており、ほぼそれを達成しています。add(sp);コンストラクターでの使用方法に注意してください。ただし、下の例ではgetContentPane().remove(sp);andを使用しています。のメソッドgetContentPane().add(someOtherPanel);は間違いなくあるので、それを使用してください。remove(Component c)JPanel

さらに、コンポーネントを 1 か所で操作すると、すべてが簡単になります。私はそれをメインメソッド、またはメインの種類のクラスで行うのが好きです。例えば:

public class Start implements ActionListener {
    Window theWindow = new Window();
    CustomPanel mainMenu = new CustomPanel();
    CustomPanel optionsMenu = new CustomPanel();
    Button myButton = new Button();
    public static void main(String[] args) {
        theWindow.add(mainMenu);
        mainMenu.add(myButton);
        myButton.addActionListener(this);

        theWindow.setVisible(true);
        theWindow.repaint();
    }

    public void actionPerformed(Event e) {
        theWindow.remove(mainMenu);
        theWindow.add(optionsMenu);
        theWindow.repaint();
    }

カスタム クラスの詳細に入る必要さえなく、これらすべてを簡単に実行できることに注目してください。プログラムと GUI をこのように構成することをお勧めします。

theWindow.revalidate()また、MadProgrammer が以下に述べているように、代わりにを使用できる場合がありますrepaint()

于 2013-08-06T05:32:47.853 に答える
0

あなたはこれを試すことができます:

~一度両方のjpanelsを追加

~イベントがあるときはいつでも、パネルの可視性を切り替えます...

例:

//global variables
int i = 0;
JPanel p2 = new JPanel();
JPanel p = new JPanel();

イベントが発生した場合は、このメソッドを呼び出します: switchPanels()、ただし、必要に応じて名前を付けることができます...:D

public void switchPanels() {
    i++;
    if(i % 2 == 0){
        p.setVisible(true);
        p2.setVisible(false);
    }else{
        p.setVisible(false);
        p2.setVisible(true);
    }

}
于 2013-08-06T09:00:33.367 に答える