1

ユーザーがログインできるようにするライブラリ アプリケーションや、その他多くの機能があります。

ログインなど、複数のウィンドウ(ビュー)を作成する方法がよくわかりません。成功した場合は、現在のウィンドウを閉じて、別のユーザー インターフェイスを開きます。

私がはっきりしていることを願っています。

4

1 に答える 1

2

更新された回答: 3 つのJPanel拡張機能がMyLoginPanelMyWelcomePanel、および と呼ばれているとしMyFormPanelます。あなたが言及したフォームは、フォームを作成する実際のコンポーネントではなく、これらの中でメインクラスになると思います。

これらの各パネルは、独自のコンポーネントを処理する必要があります。

以下のコードを見ると、私の名前を見つけて、使用している名前に置き換えるだけです。

提案:メインクラスにインターフェイスを実装して、3 つの異なるパネルでの変更をリッスンします。例: ユーザーがボタンをクリックすると、アプリケーションは次のパネルに進みます。そのボタンは誰かに知らせる必要があります。誰かがインターフェースの実装者になること。


enum AppState {
    LOGIN, WELCOME, FORM
}

interface ProgressListener {
    void progressFrom(AppState currentState);
}

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

public class MyForm implements Runnable, ProgressListener {
    // instance variables
    private JFrame frame;
    private MyLoginPanel loginPanel;
    private MyWelcomePanel welcomePanel;
    private MyFormPanel formPanel;

    /** Empty constructor of objects of class SomeClassUI. */
    public SomeClassUI() {
        // ...
    }

    /** Interface initialization. */
    @Override
    public void run() {
        // These should handle their own component initialization.
        // They should, at least, receive a reference to the listener.

        loginPanel = new MyLoginPanel(this);
        welcomePanel = new MyWelcomePanel(this);
        formPanel = new MyFormPanel(this);

        frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(loginPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    /** */
    @Override
    public void progressFrom(AppState whoTriggeredIt) {
        switch (whoTriggeredIt) {
            case LOGIN:
            frame.setContentPane(welcomePanel);
            frame.pack();
            return;

            case WELCOME:
            frame.setContentPane(formPanel);
            frame.pack();
            return;

            default: return;
        }
    }


    /** */
    public void go() {
        SwingUtilities.invokeLater(this);
    }


    /** */
    public static void main(String[] args) {
        new SomeClassUI().go();
    }
}

class MyLoginPanel extends JPanel implements ActionListener {
    private final ProgressListener listener;

    public MyLoginPanel(ProgressListener listener) {
        // Components, etc.
        this.listener = listener;
    }

        ...

    /** */
    @Override
    public void actionPerformed(ActionEvent e) {
        // Validate login, or whatever.
        // All went well, notify listener to progress.
        this.listener.progressFrom(AppState.LOGIN);
    }
}

から要素を直接追加/削除する代わりに、インスタンス変数として保存する独自のコンテンツ パネルJFrameでこれらの操作を実行することができます (「 」を参照)。JFrame.setContentPane()

すべてのパネルに同時に簡単にアクセスできるようにしたい場合は、この手順を段階的に変更する代わりにCardLayout、コメントで以前に提案したように、を調べることをお勧めします。

私が提供する提案は一般的なガイドラインにすぎません。私はあなたのニーズの詳細を認識していないからです.

于 2013-05-19T17:55:51.367 に答える