【发布时间】:2011-12-18 22:32:49
【问题描述】:
我不是 Java 程序员,我不确定我所做的是否正确,或者是否存在更好的方法来做到这一点。
我正在制作一个多线程的 Swing Java 应用程序。
我有许多摆动组件(文本字段、texarea、标签、列表...),它们通过许多线程进行设置和刷新。
对于我的所有组件,我使用类似下面的代码(这只是一个小例子)来设置/刷新它。Main.mainUI.setThumbLbl(image); 设置/刷新我的组件是不是一个好方法? (我在所有组件的其他线程中使用类似的东西)
还有其他更好的方法吗?
主要:
public class Main {
public static MyMainUI mainUI;
public static void main(String args[]) {
mainUI = new mainUI();
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
mainUI.setVisible(true);
}
});
}
}
Jframe:
public class MyMainUI extends JFrame {
private JLabel thumbLbl;
private JButton thumbBtn;
public MyMainUI(){
// add thumbLbl, thumBtn
...
thumBtn.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent evt) {
new MyThread().start();
}
});
}
public void setThumbLbl(final Image image) {
SwingUtilities.invokeLater(new Thread() {
@Override
public void run() {
thumbLbl.setIcon(new ImageIcon(image.getScaledInstance(thumbLblDim.width,
thumbLblDim.height, Image.SCALE_DEFAULT)));
}
});
}
}
线程:
public class MyThread extends Thread {
@Override
public void run() {
//Get image from web server
...
Main.mainUI.setThumbLbl(image);
}
}
注意:我很快就在文本编辑器中编写了这个示例代码,可能有一些错误,但这不是我想要的 ^^。
NB2:对不起我的英语不好。
【问题讨论】:
-
我自己,我通常使用 SwingWorker 来完成这样的事情。除了在后台线程上做事之外,它还有许多其他优点,包括因为它是一个 Future,它可以返回一个值,并且它允许轻松使用 PropertyChangeListeners。
-
感谢您的评论,我不知道 SwingWorker,它似乎是一个不错的选择。我会试试的。
-
另外:1) 你的英语很好。 2) 不要使用 MouseListener 来响应 JButton 按下,而是使用 ActionListener——这就是它的用途。有一些细微但重要的区别,一个重要的区别是,如果 JButton 已被禁用,MouseListener 仍会响应,而 ActionListener 将(正确)不响应。
-
1)谢谢谷歌翻译(这是一个笑话),2)我想知道为什么在某些情况下当我的按钮被禁用时,listerner 正在工作,我想我有很多这样的错误我的代码,它将是开源的,这就是我不想犯大错的原因,我感谢你的 cmets,我希望当我发布我的应用程序时,像你这样的人会告诉我哪里出了问题。
-
我会尝试你所说的一切并重新制作我的例子并解决这个问题
标签: java swing thread-safety swingworker concurrency