JComponent
にいくつかのJPanel
があり、スタートボタンを押したときにそれらのコンポーネントをすべて無効にしたい。
現在、私はすべてのコンポーネントを明示的に無効にしています
component1.setEnabled(false);
:
:
しかし、とにかくすべてのコンポーネントを一度に無効にできる方法はありますか?これらのコンポーネントが追加されるJPanel
を無効にしようとしました
panel.setEnabled(false);
しかし、それは機能しませんでした。
パネルには getComponents()
メソッドが必要です。このメソッドをループで使用して、サブコンポーネントに明示的に名前を付けずに無効にすることができます。
Disabled Panel は、2つのアプローチのサポートを提供します。 1つはコンポーネントを再帰的に無効にするためのもので、もう1つは無効な外観でパネルを「ペイント」するためのものです。
JXLayerを LockableUI とともに使用します。
次の方法では、再帰を使用してこれを実現します。任意のContainer
を渡すと、このメソッドは、Component
の「内部」にあるすべての非コンテナコンポーネントのContainer
配列を返します。
private Component[] getComponents(Component container) {
ArrayList<Component> list = null;
try {
list = new ArrayList<Component>(Arrays.asList(
((Container) container).getComponents()));
for (int index = 0; index < list.size(); index++) {
for (Component currentComponent : getComponents(list.get(index))) {
list.add(currentComponent);
}
}
} catch (ClassCastException e) {
list = new ArrayList<Component>();
}
return list.toArray(new Component[list.size()]);
}
}
返された配列の要素をループして、コンポーネントを無効にするだけです。
for(Component component : getComponents(container)) {
component.setEnabled(false);
}
次のメソッドは、追加する必要があるすべてのものである必要があります。setEnableRec(panel, true)
またはsetEnableRec(panel, false)
を使用して呼び出すことができます。
private void setEnableRec(Component container, boolean enable){
container.setEnabled(enable);
try {
Component[] components= ((Container) container).getComponents();
for (int i = 0; i < components.length; i++) {
setEnableRec(components[i], enable);
}
} catch (ClassCastException e) {
}
}
無効化は再帰的に行う必要があります。
Queue<Component> queue = new LinkedList<>(Arrays.asList(container.getComponents()));
while(!queue.isEmpty()) {
Component head = queue.poll();
head.setEnabled(enable);
if(head instanceof Container) {
Container headCast = (Container) head;
queue.addAll(Arrays.asList(headCast.getComponents()));
}
}