GUI与内部数据处理线程交互的问题 用户界面启动后,同时启动内部数据处理线程。在某个时刻,内部数据处理线程在后台进行数据处理后,要更新窗体上某个组件的值,请问有哪些比较好的处理方法。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【still_rain】截止到2008-06-27 13:43:05的历史汇总数据(不包括此帖):发帖数:7 发帖分:180 结贴数:7 结贴分:180 未结数:0 未结分:0 结贴率:100.00% 结分率:100.00% 敬礼! 把该组件声明为public的或者直接以参数传过去,然后直接更新值就行了! 估计你是web做多了走火入魔了,GUI的组件你更新了属性之后它自己会刷新显示的。 faint,可能性很大。借这个帖子再问个问题。界面用的是SWT,SWT禁止非本体线程对控件的显示内容进行更改。我的后台数据处理线程需要不定时的进行数据处理(时间随机),然后将处理结果反馈给用户界面(可能中间处理的一些信息也要打印到用户界面),这个数据处理的线程如何将这些需要更新的信息传递给用户界面?直接访问用户界面组件? Display.getDefault().syncExec(new Runnable() { public void run() { //需要用非主线程刷新界面组件的代码 } }); 给个例子你看import org.eclipse.swt.SWT;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Shell;import org.eclipse.swt.widgets.Text;public class MM{ private Text text; private Shell shell; public static void main(String[] args) { try { MM window = new MM(); window.open(); } catch(Exception e) { e.printStackTrace(); } } public void open() { final Display display = Display.getDefault(); createContents(); shell.open(); shell.layout(); Thread thread = new Thread() { public void run() { while(true) { Display.getDefault().syncExec(new Runnable() { public void run() { text.setText(System.currentTimeMillis() + ""); } }); try { sleep(1000); } catch(InterruptedException e) { e.printStackTrace(); } } } }; //设为后台线程,否则关闭窗体后该线程还在运行 thread.setDaemon(true); thread.start(); while(!shell.isDisposed()) { if(!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } protected void createContents() { shell = new Shell(); shell.setSize(266, 170); shell.setText("SWT Application"); text = new Text(shell, SWT.BORDER); text.setBounds(34, 48, 197, 26); }} 首先非常感谢craky的热心帮助。你的这个方法感觉是用户界面去询问内部数据处理线程,控件内容应该刷新显示什么数据,而我的想法是想内部数据处理线程在需要更新控件时,再更新用户界面的相关控件。类似于内部线程发出一个消息或者事件,然后用户界面某个监听器捕获,然后进行处理。不知道意思表达的对不对,再一次表示感谢。 8楼代码里面的那个thread线程就相当于你的数据处理线程喽,呵呵~~~~~~~~~~~~你完全可以单独拿开放到别的地方去,我只是为了写起来方便用了个内部类的而已 帮帮看看此小程序错哪了``` 简单的JAVA小问题 请帮忙 我知道为什么JAVA会比.NET发开周期长那么多了 帮忙看看那里错啦 直接打印String[]对象,输出结果是什么意思? 请问java如何在vrml里弹出窗口 老师昨天刚出的一道回家作业:一个旋转二维数组,望各位大哥指点迷泾? 在JBuilder如何引用类库啊? 怎么向数据库输入长二进制数据 常有人说java什么都能做,我作为一个初学者对此感到很困惑! Java有什么方法可以不要以子进程的方式运行外部程序? java中如何匹配“\”
楼主【still_rain】截止到2008-06-27 13:43:05的历史汇总数据(不包括此帖):
发帖数:7 发帖分:180
结贴数:7 结贴分:180
未结数:0 未结分:0
结贴率:100.00% 结分率:100.00%
敬礼!
估计你是web做多了走火入魔了,GUI的组件你更新了属性之后它自己会刷新显示的。
{
public void run()
{
//需要用非主线程刷新界面组件的代码
}
});
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;public class MM
{
private Text text; private Shell shell; public static void main(String[] args)
{
try
{
MM window = new MM();
window.open();
}
catch(Exception e)
{
e.printStackTrace();
}
} public void open()
{
final Display display = Display.getDefault();
createContents();
shell.open();
shell.layout(); Thread thread = new Thread()
{
public void run()
{
while(true)
{
Display.getDefault().syncExec(new Runnable()
{
public void run()
{
text.setText(System.currentTimeMillis() + "");
}
}); try
{
sleep(1000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
};
//设为后台线程,否则关闭窗体后该线程还在运行
thread.setDaemon(true);
thread.start(); while(!shell.isDisposed())
{
if(!display.readAndDispatch())
{
display.sleep();
}
} display.dispose();
} protected void createContents()
{
shell = new Shell();
shell.setSize(266, 170);
shell.setText("SWT Application");
text = new Text(shell, SWT.BORDER);
text.setBounds(34, 48, 197, 26);
}
}
你的这个方法感觉是用户界面去询问内部数据处理线程,控件内容应该刷新显示什么数据,而我的想法是想内部数据处理线程在需要更新控件时,再更新用户界面的相关控件。类似于内部线程发出一个消息或者事件,然后用户界面某个监听器捕获,然后进行处理。
不知道意思表达的对不对,再一次表示感谢。