我正在尝试为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;
}
}
但是这种方式执行的代码无法正常工作。线程启动,运行方法运行良好。但是可能不喜欢将
ActionListener
添加到get方法中。即使我尝试了这个:JButton browse = data.getBrowseButton();
browse.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent evt){
//Some code
}
});
data.setBrowseButton(browse);seButton(browse);
但是,即使那样也不是正确的方法。
那么,有人知道如何从另一个类向按钮添加ActionListener吗?
谢谢 :)
最佳答案
要在单独的线程中执行按钮动作,请勿将动作侦听器的创建置于方法运行中,而要将要执行的动作置于方法运行中。
从PanelActions中删除任何可运行的对象:
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();
}