1

我正在使用 Java swing 为我的 Java 游戏制作关卡编辑器。

其中一项功能是有一个可切换按钮来打开和关闭游戏以测试关卡。游戏在 jpanel 中运行,然后再次单击按钮取消切换,它会关闭游戏。

我只希望用户能够在游戏未运行时更改摇摆应用程序中的内容或按下按钮,当游戏运行时,我将焦点设置到游戏组件。在挥杆应用程序中,他们应该能够按下的唯一按钮是用于关闭游戏的切换按钮。

问题是,我想不出一个好的方法来做到这一点。使用递归函数,我可以轻松循环并找到所有组件并执行 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

另一种选择是使用一个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 回答