我的ActionListener遇到了一个技术问题。你看,我有一个按钮可能有几个操作,这取决于之前单击的是哪个MenuItem。因此我创建了一个带有ActionEvent e的ActionListener。“e”应该验证以下3个条件之一(因为我有3个菜单项-添加、删除和修改),根据选择的是哪一个,发生的动作彼此不同。
问题是,这两个e.getSource()条件都没有得到验证(尽管我已经检查过几次了),
private void buttonValidateActionPerformed(java.awt.event.ActionEvent evt){
// TODO add your handling code here:
ActionListener l = (ActionEvent e) -> {
if(e.getSource()==menuItemAdd)
{
System.out.println("eureka!");
buttonResearch.setEnabled(false);
if (evt.getSource()== buttonValidate)
{
DataTransac dt = new DataTransac();
dt.ajouterProgrammeurs("...");
}
}
if(e.getSource()==itemDelete)
{
if(evt.getSource()== buttonValidate)
{
DataTransac dt = new DataTransac();
dt.deleteProgrammers("...");
}
}
if(e.getSource()==itemModify)
{
if(evt.getSource()==buttonValidate)
{
DataTransac dt = new DataTransac();
dt.modifyProgrammeurs("...");
}
}
};
menuItemAdd.addActionListener(l);
itemDelete.addActionListener(l);
itemModify.addActionListener(l);
/*
*/
}
我尝试了“.equals()”方法,但效果不佳。
ActionListener l = (ActionEvent e) -> {
if(e.equals(menuItemAjouter))
{
System.out.println("eureka!");
buttonResearch.setEnabled(false);
if (evt.getSource()== buttonValidate)
{
DataTransac dt = new DataTransac();
dt.addProgrammers("...");
}
...
在测试了散列方法之后,我偶然发现了一个奇怪的bug。起初,当我点击“添加”菜单项,然后点击“验证”按钮时,什么都没有发生。然而,如果我点击“验证”按钮,然后点击“添加菜单项”,代码就可以工作了......我将尝试不同的条件。
2条答案
按热度按时间pgky5nke1#
我有一个按钮,有几个可能的行动,这取决于哪个菜单项被点击之前。
响应按钮单击而激发的
ActionEvent
的源是被单击的按钮。不能使用它来查询用户以前与之交互的控件。至少不能直接查询。GUI中的控制流对我来说并不完全清楚,但是您的替代方法可以分为以下几类:
ActionListener
中的哪一个,以便效果的选择可以由调用的侦听器驱动。前两种方法中的任何一种都比最后一种好得多,我提供最后一种方法主要是为了完整性。
idv4meu82#
这是一个非常令人困惑的问题。
我首先要说的是,使用
getSource
通常是一个坏主意。它将操作耦合到组件--这正是引入侦听器要摆脱的问题。这就像回到JDK 1.00,没有人希望那样,只是现在我们增加了额外的复杂性。而且Swing倾向于使用复合组件(这是Composite设计模式)。让我们看看您的代码。
私有空按钮验证已执行的操作(java.awt.事件.操作事件事件){
// TODO在此处添加处理代码:动作监听器l =(动作事件e)-〉{
这是怎么回事。请真实的的行动监听站起来。放一些printfs在(或使用调试器),以确保控制流是预期的。
我想你也写过。
按钮验证=菜单项目添加;
在你的监听器中检查一下是否一切都设置正确是值得的。尝试在顶部使用一些printfs。
如果你在某个地方搞砸了某个赋值语句,它应该会显示为意外的对象哈希代码。
我建议退出代码,并为每个操作添加一个操作侦听器。您不应该到处都需要这些
if
语句。在每个侦听器中,如果需要,它们可以检查状态。