我有一个具有一排按钮的程序。这些按钮的启用或禁用取决于当前具有焦点的组件。
至少他们应该是。我不知道该怎么做。至少不正确。以下是我的想法:
- 每个获得焦点的组件决定是否启用按钮将在焦点获得/丢失事件上启用/禁用它。抓住?如果我尝试单击它,它也会禁用该按钮(因为它也会失去焦点)。我也许可以解决它,但这会使事情复杂化很多。
- 创建一个全局侦听器,用于侦听失去焦点和获得焦点事件,然后分别禁用和启用按钮。
似乎方法 2 是可行的方法,因为它更加集中,但是否有另一种更好的方法?
编辑:这就是我最终做的:
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);