1

Java swing を使用して Java ゲームのレベル エディタを作成しています。

機能の 1 つは、レベルをテストするためにゲームのオンとオフを切り替えるための切り替え可能なボタンがあることです。ゲームは jpanel 内で実行され、ボタンをもう一度クリックして切り替えを解除すると、ゲームがオフになります。

ゲームが実行されていないときにのみ、ユーザーがスイングアプリケーションの内容を変更したりボタンを押したりできるようにしたいのですが、実行中はゲームコンポーネントにフォーカスを設定します。Swing アプリケーションで押すことができる唯一のボタンは、ゲームをオフに戻すためのトグル ボタンです。

問題は、これを行う良い方法が思いつかないことです。再帰関数を使用すると、簡単にループしてすべてのコンポーネントを見つけて setEnabled(false) を実行できますが、ゲームがオフに戻ると、以前の有効な状態が何であったかを知る方法がありません (他のコンポーネントが応答するなどの問題もあります)。 setEnabled が他のコンポーネントで呼び出されている)

私が本当に必要だと思うのは、ゲームが実行されているときに、swing アプリケーションへのユーザー入力を完全に「殺す」ためのある種の方法です.. JPanel内で実行されているゲームは、フォーカスできる必要があります...

この種のことを、swing アプリケーションのコンポーネントを管理するための大量の「組織的な」コードなしで行う方法はありますか?

4

3 に答える 3

2

このように、すべてをマップに配置できます。

class ComponentState { 
 private JComponent component;
 private bool on;
 // Getters & Setters
}

private Map<String, ComponentState> components = new HashMap<>();

ゲームに新しいコンポーネントを追加するには:

components.add("startbutton", new ComponentState(new JButton, true));

次に、すべてのコンポーネントを画面に追加します。

for(String key : components.KeySet()) {
 ComponentState comp = components.get(key);
 if(comp.isOn()) { this.add(comp.getComponent()) };
}

コンポーネントを無効化/有効化するには:

components.get("myActivatedComponent").disable(); // disable is a self defined method
于 2013-10-28T10:03:05.740 に答える
2

disableAll()すべてのコンポーネントを無効な状態に設定するメソッドと、すべてのコンポーネントの状態を以前の状態にリセットするメソッドresetAll()が必要です。後で復元できるようにするには、無効にするときにすべてのコンポーネントのステータスを保存する必要があります。それはO(n)スペースを取ります。

private final Map<JComponent, Boolean> components = new HashMap<JComponent, Boolean>();

public void disableAll(JComponent root) {
    components.put(root, root.isEnabled());
    root.setEnabled(false);

    for (int i=0, n=root.getComponentCount(); i<n; i++) {
        JComponent child = (JComponent) root.getComponentAt(i);
        disableAll(child);
    }
}

public void resetAll(JComponent root) {
    boolean status = components.get(root);
    root.setEnabled(status);

    for (int i=0, n=root.getComponentCount(); i<n; i++) {
        JComponent child = (JComponent) root.getComponentAt(i);
        resetAll(child);
    }
}
于 2013-10-28T10:46:10.803 に答える
1

もう 1 つのオプションはGlassPane、コンポーネントの領域を使用して「グレー表示」することです。また、ユーザーがクリックしたくない領域のペインでクリックをキャプチャして無視する必要があります。

Java チュートリアルの例を参照してください: http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html

この記事も参考になるかもしれません: https://weblogs.java.net/blog/alexfromsun/archive/2006/09/a_wellbehaved_g.html

于 2013-10-28T12:43:24.900 に答える