2013-10-28 1 views
1

Я создаю редактор уровней для своей java-игры с использованием Java swing.Включить «включено» состояние большого количества компонентов в Java Swing applicaiton

Одна из особенностей заключается в том, что есть кнопка для включения и выключения игры для проверки уровня. Игра проходит внутри jpanel, затем вы снова нажимаете кнопку, чтобы развязать ее, и она отключает игру.

Я только хочу, чтобы пользователь мог изменить материал или кнопки в приложении swing, когда игра не работает, когда она запущена. Я задал фокус игровому компоненту. Единственная кнопка в приложении swing, которую они должны нажать, - это кнопка переключения, чтобы отменить игру.

Проблема в том, что я не могу придумать, как это сделать. Используя рекурсивную функцию, я мог легко выполнить цикл и найти все компоненты и сделать setEnabled (false), но когда игра будет отключена, у нее нет способа узнать, что было в предыдущем разрешенном состоянии (по другим вопросам, например, другим компонентам, отвечающим на setEnabled вызывается на других компонентах)

Я думаю, что мне действительно нужен только какой-то способ просто «убить» пользовательский ввод в приложение swing, когда игра запущена. Но предпочтительно использовать способ щелчка еще раз переключить кнопку, чтобы вернуть состояние приложения, и игра, которая работает внутри Jpanel, должна иметь возможность фокусироваться ...

Есть ли какой-либо способ сделать такую ​​вещь вообще без огромного количества «организационных «код для управления компонентами в swing ap пликация?

ответ

1

Другой вариант заключается в использовании GlassPane и «серым» площадью компонентов. Вам также необходимо будет захватить и игнорировать клики в области для области, которую вы не хотите, чтобы пользователи нажимали.

Смотреть еще с примером в Java Tutorial здесь: http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html

Это пишут также может быть полезно: https://weblogs.java.net/blog/alexfromsun/archive/2006/09/a_wellbehaved_g.html

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 
+0

Вы должны использовать Map , до тех пор, как пользовательских компонентов используйте реализацию hashcode() по умолчанию (возвращая адрес памяти). Это уменьшит количество мелких объектов (Boolean class использует интернирование, поэтому будет только два экземпляра). –

+0

@ AurélienRibon: тогда у вас не будет способа специально получить компонент. Как бы вы вернули стартовую кнопку из этой «Карты»? –

+0

Ваша кнопка запуска определена где-то, поэтому вы должны иметь ссылку на нее где-то. Но карта предназначена для использования в рекурсивной функции, как предлагал ОП. –

2

You w ant a 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); 
    } 
} 
+0

Понимаю, так вы интерпретировали рекурсивный. Достаточно справедливо, так оно и есть рекурсивное. Это немного другой подход, я думаю, он зависит от того, как вы хотите ссылаться на компонент: из поля или ключа в «карте». –