在 Swing 中清除按钮单击操作上的文本字段
Clear textfield on button click action in Swing
我有许多按钮,单击这些按钮时将 运行 一个脚本,如果成功,将生成一条 Passed/Failed 消息,该消息显示在使用 Swing 的 GUI 的文本字段中。我注意到即使在单击 运行 脚本的新按钮后,仍会显示先前结果的文本。此文本会一直显示,直到脚本完成,生成一个新的结果,然后显示。
我想添加一些代码,以便在单击新按钮时重置文本字段,并且在脚本完成之前不显示任何文本。
一个按钮:
Test1 = new JButton("Test1");
Test1.setLocation(290, 30);
Test1.setSize(120, 30);
Test1.addActionListener(this);
Test1.addMouseListener(new MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent e) {
if (Test1.isEnabled()) {
errorLabel.setText("");
result = JUnitCore.runClasses(Test1.class);
errorMessageDisplay(result);
}
}
});
buttonPanel.add(Test1);
错误信息代码:
public void errorMessageDisplay(Result resultPass) {
errorLabel.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
errorLabel.setText("");
errorLabel.setVisible(true);
}
});
if (result.getFailureCount() > 0) {
errorLabel.setForeground(Color.red);
errorLabel.setVisible(true);
errorLabel.setText(" Failed");
}
else {
errorLabel.setForeground(Color.green);
errorLabel.setText(" Passed");
errorLabel.setVisible(true);
}
}
最简单的解决方案是创建另一个线程。
if (Test1.isEnabled()) {
errorLabel.setText("");
new Thread(()->{
Result result = JUnitCore.runClasses(Test1.class);
EventQueue.invokeLater(()->errorMessageDisplay(result));
}).start();
}
这不是一个很好的解决方案,考虑使用 SwingWorker 或 ExecutorService。
使用执行器服务的一个简单示例是在启动时创建一个执行器。
ExecutorService service = Executors.newSingleThreadExecutor();
然后向它提交作业。
if (Test1.isEnabled()) {
errorLabel.setText("");
service.submit(()->{
Result result = JUnitCore.runClasses(Test1.class);
EventQueue.invokeLater(()->errorMessageDisplay(result));
});
}
这将允许您提交多个作业,但它们将是 运行 连续的。您也可以通过图形用户界面控制作业流程。
if (Test1.isEnabled()) {
test1.setEnabled(false);
errorLabel.setText("");
service.submit(()->{
Result result = JUnitCore.runClasses(Test1.class);
EventQueue.invokeLater(()->{
errorMessageDisplay(result);
test1.setEnabled(true);
});
});
}
我有许多按钮,单击这些按钮时将 运行 一个脚本,如果成功,将生成一条 Passed/Failed 消息,该消息显示在使用 Swing 的 GUI 的文本字段中。我注意到即使在单击 运行 脚本的新按钮后,仍会显示先前结果的文本。此文本会一直显示,直到脚本完成,生成一个新的结果,然后显示。
我想添加一些代码,以便在单击新按钮时重置文本字段,并且在脚本完成之前不显示任何文本。
一个按钮:
Test1 = new JButton("Test1");
Test1.setLocation(290, 30);
Test1.setSize(120, 30);
Test1.addActionListener(this);
Test1.addMouseListener(new MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent e) {
if (Test1.isEnabled()) {
errorLabel.setText("");
result = JUnitCore.runClasses(Test1.class);
errorMessageDisplay(result);
}
}
});
buttonPanel.add(Test1);
错误信息代码:
public void errorMessageDisplay(Result resultPass) {
errorLabel.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
errorLabel.setText("");
errorLabel.setVisible(true);
}
});
if (result.getFailureCount() > 0) {
errorLabel.setForeground(Color.red);
errorLabel.setVisible(true);
errorLabel.setText(" Failed");
}
else {
errorLabel.setForeground(Color.green);
errorLabel.setText(" Passed");
errorLabel.setVisible(true);
}
}
最简单的解决方案是创建另一个线程。
if (Test1.isEnabled()) {
errorLabel.setText("");
new Thread(()->{
Result result = JUnitCore.runClasses(Test1.class);
EventQueue.invokeLater(()->errorMessageDisplay(result));
}).start();
}
这不是一个很好的解决方案,考虑使用 SwingWorker 或 ExecutorService。
使用执行器服务的一个简单示例是在启动时创建一个执行器。
ExecutorService service = Executors.newSingleThreadExecutor();
然后向它提交作业。
if (Test1.isEnabled()) {
errorLabel.setText("");
service.submit(()->{
Result result = JUnitCore.runClasses(Test1.class);
EventQueue.invokeLater(()->errorMessageDisplay(result));
});
}
这将允许您提交多个作业,但它们将是 运行 连续的。您也可以通过图形用户界面控制作业流程。
if (Test1.isEnabled()) {
test1.setEnabled(false);
errorLabel.setText("");
service.submit(()->{
Result result = JUnitCore.runClasses(Test1.class);
EventQueue.invokeLater(()->{
errorMessageDisplay(result);
test1.setEnabled(true);
});
});
}