我正在尝试为java swing GUI制作干净的OOP代码。 所以我创建了一个实现Runnable的类,并且应该处理所有操作。 我存储在充满getter和setter的数据类中的所有数据和组件。
public class UserInterface{
...
public void foo(){
PanelActions panelActions = new PanelActions();
Thread tProgressbar = new Thread(panelActions, "Update progressbar");
tProgressbar.start();
}
}
public class PanelActions implements Runnable{
GUIdata data = new GUIdata();
public void run(){
//submitButton
data.getSubmitButton().addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt) {
//Some code
}
});
//Browse Button
data.getBrowseButton().addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt) {
//Some code
}
});
};
}
以及getter和setter类:
public class GUIdata{
private JButton submitButton;
private JButton browseButton;
GUIdata(){
submitButton = new JButton();
browseButton = new JButton();
}
public JButton getSubmitButton() {
return submitButton;
}
public void setSubmitButton(JButton submitButton) {
this.submitButton = submitButton;
}
public JButton getBrowseButton() {
return browseButton;
}
public void setBrowseButton(JButton browseButton) {
this.browseButton = browseButton;
}
}
但是这样行动中的代码不起作用。线程启动,运行方法运行良好。但可能它不喜欢在get方法中添加ActionListener
。即使我试过这个:
JButton browse = data.getBrowseButton();
browse.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt){
//Some code
}
});
data.setBrowseButton(browse);seButton(browse);
但即使这样也不是正确的方法。
那么有人知道如何从另一个类向Button添加ActionListener吗? 谢谢:))
答案 0 :(得分:2)
要在单独的线程中执行按钮操作,请不要将动作侦听器的创建放入方法运行中,将要执行的操作放在方法运行中。
从PanelActions中删除任何runnable:
public class PanelActions {
GUIdata data = new GUIdata();
//submitButton
data.getSubmitButton().addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt) {
//Some code
}
});
//Browse Button
data.getBrowseButton().addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt) {
//Some code
}
});
}
在actionPerformed中创建一个Runnable或Thread并开始执行
@Override
public void actionPerformed(ActionEvent evt) {
Thread thread = new Thread() {
@Override
public void run() {
//Some code
}
};
thread.start();
}
答案 1 :(得分:0)
"Update progressbar"
给我的印象是您可能需要invokeLater
:
data.getBrowseButton().addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt) {
EventQueue.invokeLater(new Runnable() {
//Some code
});
}
});
这使事件处理线程处理按钮单击(actionPerformed)。只是稍后代码执行并响应,重新绘制进度条。
另一种软件设计可能更清晰。您可以使用Action(扩展AbstractAction)。做一些动作并将它们放入JButtons。