我一直在将Substance的外观和感觉整合到我的应用程序中,并遇到了几个关于它的内部EDT(事件调度线程)检查例程的问题.Substance绝对拒绝在EDT之外构建UI类.我已经做了很多Swing/AWT,我知道关于EDT的大部分规则.我使用SwingWorker,SwingUtilties.invokeLater来修改组件.我总是认为组件可以在EDT之外构建,但必须在EDT上实现和操作.换句话说,您可以在后台构造和设置默认值,但对pack/setVisible的调用必须是EDT以及操作组件的任何后续调用.
我问的原因是我有一个特别"强大"的窗口来构建,涉及许多小部件,状态和资源(许多图标).以前,我在SwingWorker的背景方法上构建了窗口,并在done方法中使窗口可见.从来没有一个问题.切换到Substance后,内部EDT检查会让我感到困惑.
我已经能够重构代码来解决这个问题.我可以在EDT上构建这不是一个好的解决方案,因为整个应用程序将阻止.我还可以进行更多的重构,并尽力在EDT之外加载所有额外的资源.
把它包装起来...... 构建 Swing/AWT小部件不是在Event Dispatch Thread上安全吗?
在stackoverflow上的人的帮助下,我能够获得以下简单GUI倒计时的工作代码(它只显示一个倒数秒的窗口).我对这段代码的主要问题是这些invokeLater东西.
据我所知invokeLater,它向事件调度线程(EDT)发送任务,然后EDT在"可以"(无论这意味着什么)时执行该任务.是对的吗?
根据我的理解,代码的工作原理如下:
在main我们用于invokeLater显示窗口(showGUI方法)的方法中.换句话说,显示窗口的代码将在EDT中执行.
在该main方法中,我们也启动counter并且计数器(通过构造)在另一个线程中执行(因此它不在事件调度线程中).对?
它counter在一个单独的线程中执行,并定期调用updateGUI.updateGUI应该更新GUI.GUI正在EDT中运行.所以,updateGUI也应该在EDT中执行.这就是为什么该代码的原因updateGUI被封闭在invokeLater.是对的吗?
我不清楚的是为什么我们打电话counter给EDT.无论如何,它不是在EDT中执行的.它立即启动,一个新线程并在counter那里执行.那么,为什么我们不能counter在invokeLater块之后调用main方法呢?
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class CountdownNew {
static JLabel label;
// Method which defines the appearance of the window.
public static void showGUI() {
JFrame frame = new JFrame("Simple Countdown");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
label …Run Code Online (Sandbox Code Playgroud) 我是Java的新手,尤其是Swing库.当我尝试使用Notepad演示(来自JDK的标准演示)时,我在编辑器窗口中尝试更改文本时遇到了崩溃.我的示例代码:
void Filter(Component f){
if (f instanceof JTextComponent){
JTextComponent textComponent = (JTextComponent) f;
textComponent.setVisible(false); //Works
textComponent.setVisible(true); //Works
textComponent.getText(); //Works
textComponent.updateUI(); //Works
textComponent.setText("Hello world!"); //Crashes
}else{
RecursiveGet(f);
}
}
void RecursiveGet(Component c){
for (Component f : ((JComponent) c).getComponents()) {
if (f instanceof JComponent) {
Filter(f);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我搜索了JTextComponent实例,直到找到它然后测试了一些方法.我想我错过了一些东西,一些细节.我的环境JDK 1.7,JRE 7.0,Win7 x64.我很乐意得到任何帮助.谢谢.
更新 我添加了异常处理程序
void Filter(Component f){
if (f instanceof JTextComponent){
JTextComponent textComponent = (JTextComponent) f;
textComponent.setVisible(false); //Work
textComponent.setVisible(true); //Work
textComponent.getText(); //Work
textComponent.updateUI(); //Work
try {
textComponent.setText("Hello world!"); //Crash …Run Code Online (Sandbox Code Playgroud)