我有一个编辑按钮,它控制更改按钮的操作。
当“编辑”按钮为 true 时,“更改”按钮应转到“编辑”,当它不为 true 时,应转到“查看”。
问题是“编辑”按钮执行不一致。
第一次加载代码时,编辑按钮将在 true 和 false 之间切换,正如它应该的那样。但是,如果我按下 Change 按钮,Edit 按钮将不再在 true 和 false 之间切换,而是会在一次迭代中先变为 true,然后变为 false。第三次它将按预期执行,并继续此交替循环。
我在 Editbutton 的监听器中使用 return 语句,该语句应该在 if 语句之后停止代码。我添加了数字来跟踪正在执行的内容,似乎代码第二次执行超过返回语句时,例如没有停止。要么是这样,要么是由于某种原因,代码第二次重新加载。
下面是我的代码的 MCVE 版本:
public class Toolbar {
static Color c;
static JButton buttonEdit = new JButton("Edit");
public static JFrame frame = new JFrame();
static boolean Edit, Delete;
public static void main(String[] args) {
Toolbar.WorkDiaryAllGui();
System.out.println("TOOLBAR");
}
public static JPanel Toolbar(String panelname){
FlowLayout layout = new FlowLayout();
JPanel Toolbar = new JPanel(new BorderLayout());
Toolbar.setLayout(layout);
JButton Changebutton = new JButton("Diary");
Changebutton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
WorkDiaryAllGui();
}
});
buttonEdit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(Edit==false){
Edit = true;
buttonEdit.setBackground(Color.CYAN);
System.out.println(1);
return;
}
if(Edit==true){
Edit = false;
buttonEdit.setBackground(c);
System.out.println(2);
return;
}
}
});
Toolbar.add(Changebutton);
Toolbar.add(buttonEdit);
return Toolbar;
}
public static void WorkDiaryAllGui(){
JPanel WorkDiaryAll = new JPanel();
WorkDiaryAll.add(Toolbar.Toolbar("Whole Diary"));
frameGui(WorkDiaryAll, "Whole Diary");
}
public static void frameGui(JPanel panel, String name){
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(panel);
frame.setSize(1200,500);
frame.setVisible(true);
}
}
最佳答案
每次调用 Toolbar
时,您都会向按钮添加另一个监听器。
在我调用它一次之后,它有一个监听器,可以切换编辑模式(或按钮应该执行的任何操作)。
如果我再次调用它,它会返回一个新的 JPanel,其中包含与之前相同的按钮,它现在有两个用于切换编辑模式的监听器。当我单击该按钮时,它会切换编辑模式两次。
如果我再次调用它,它有三个监听器。如果我单击该按钮,它会切换编辑模式三次。等等。
我建议让 Toolbar
(该方法)在每次调用时创建全新的 GUI 对象。如果您这样做,Toolbar
(类)应该不需要任何字段(至少在您问题的代码版本中)。
此外,通常的 Java 约定是以小写字母开头的方法名称 - 然而,这只是一个样式问题,并不会阻止您的程序运行,因此如果您愿意,请更改它。
更严重的样式问题(但仍然只影响代码的可读性,而不影响代码是否有效) - 方法名称应该描述它们的作用。 Toolbar
是工具栏吗?我不认为它是工具栏,所以它不应该被命名为Toolbar
。 (同样,WorkDiaryAllGui
并不支持所有 GUI 的日记,并且 frameGui
也不支持 GUI)。如果您需要其他样式提示,请考虑将您的代码(一旦有效)发布到 https://codereview.stackexchange.com/ .
关于java - 代码执行明显不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26814399/