ボタンの列を持つプログラムがあります。これらのボタンは、現在フォーカスがあるコンポーネントに応じて有効または無効になります。
少なくともそうあるべきです。やり方がわかりません。少なくとも適切ではありません。ここに私の考えがあります:
- ボタンが有効かどうかをフォーカスが決定する各コンポーネントは、フォーカスの獲得/喪失イベントでボタンを有効/無効にします。キャッチ?ボタンをクリックしようとすると、ボタンも無効になります(フォーカスも失われるため)。私はおそらくそれを回避することができますが、それは物事を非常に複雑にします.
- フォーカス喪失イベントとフォーカス獲得イベントをリッスンし、それぞれボタンを無効化および有効化するグローバル リスナーを作成します。
メソッド no2 はより集中化されているため、うまくいくようですが、もっと良い方法はありますか?
編集:これは私がやったことです:
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener()
{
public void eventDispatched(AWTEvent e)
{
if (e.getID() == 1004) //FOCUS_GAINED
{
if (Main.getGui().getActiveDocument() != null)
{
close.setEnabled(true);
save.setEnabled(true);
send.setEnabled(true);
if (e.getSource() instanceof Element)
{
addChapter.setEnabled(true);
delete.setEnabled(true);
superscript.setEnabled(true);
subscript.setEnabled(true);
if (e.getSource() instanceof Title)
{
if (((Title) e.getSource()).getChapter().getType() == 0)
{
addQuestion.setEnabled(true);
addListElement.setEnabled(false);
}
else
{
addListElement.setEnabled(true);
addQuestion.setEnabled(false);
}
addAnswer.setEnabled(false);
}
else if (e.getSource() instanceof Question)
{
addQuestion.setEnabled(true);
if (((Question) e.getSource()).getAnswerCount() < 5)
{
addAnswer.setEnabled(true);
}
else
{
addAnswer.setEnabled(false);
}
addListElement.setEnabled(false);
}
else if (e.getSource() instanceof Answer)
{
addQuestion.setEnabled(true);
if (((Answer) e.getSource()).getQuestion().getAnswerCount() < 5)
{
addAnswer.setEnabled(true);
}
else
{
addAnswer.setEnabled(false);
}
addListElement.setEnabled(false);
}
else if (e.getSource() instanceof ListElement)
{
addListElement.setEnabled(true);
addQuestion.setEnabled(false);
addAnswer.setEnabled(false);
}
}
else
{
addChapter.setEnabled(false);
addQuestion.setEnabled(false);
addAnswer.setEnabled(false);
addListElement.setEnabled(false);
delete.setEnabled(false);
superscript.setEnabled(false);
subscript.setEnabled(false);
}
}
else
{
close.setEnabled(false);
save.setEnabled(false);
send.setEnabled(false);
addChapter.setEnabled(false);
addQuestion.setEnabled(false);
addAnswer.setEnabled(false);
addListElement.setEnabled(false);
delete.setEnabled(false);
superscript.setEnabled(false);
subscript.setEnabled(false);
}
}
}
}, AWTEvent.FOCUS_EVENT_MASK);