2
回答
java swing 程序运行完打印信息才显示出来
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

最近做一个swing的小程序,我想将所有控制台打印的信息截取到在JTextArea上显示,这个可以实现了,按理说应该是程序一边运行,打印信息一直更新,直至程序结束才对,我做的不知道怎么回事,程序运行中一点也不显示,程序运行完了,就将所有的打印信息一下子全部显示出来了,有没有swing大神给看一下,怎么回事

final JTextArea text = new JTextArea();

		OutputStream textAreaStream = new OutputStream() {
			public void write(int b) throws IOException {
				text.append(String.valueOf((char) b));
			}

			public void write(byte b[]) throws IOException {
				text.append(new String(b));
			}

			public void write(byte b[], int off, int len) throws IOException {
				text.append(new String(b, off, len));
			}
		};
		PrintStream myOut = new PrintStream(textAreaStream);
		
		System.setOut(myOut);
		System.setErr(myOut);		
		
		 
		text.setEditable(false);
		JScrollPane jScrollPane = new JScrollPane();
		jScrollPane.setBounds(10, 430, 600, 120);
		jScrollPane.setViewportView(text);
		
		text.setFont(new Font("标楷体", Font.BOLD, 16));
		text.setLineWrap(true);// 激活自动换行功能
		text.setWrapStyleWord(true);// 激活断行不断字功能		
		text.setCaretPosition(text.getText().length());	   	  
		jF.add(jScrollPane);

举报
GuGu-Gavin
发帖于8个月前 2回/303阅

首先,不能在事件派发线程(绘制界面和处理事件的线程)中执行耗时或者阻塞操作,这会导致界面没反应,像卡住了一样。io操作通常都是有阻塞或者耗时操作,所以不能放在事件派发线程里面执行。另外,修改swing组件的代码应该在事件派发线程中执行。你的代码违反了上面2个规范。你上面说的直到程序执行完了才打印是因为在输出的过程中,ui线程被阻塞,所以输出的结果没办法反应到界面上来

--- 共有 1 条评论 ---
GuGu-Gavin现在已经能够显示了,又新开一个线程,但是您说的那个swing组件代码应该在事件派发线程中执行哪里错了,没有听明白?0.0. 8个月前 回复

可能是我理解错了吧,swing或者android涉及到GUI这类编程都有个类似事件指派线程的概念,这个理解好了GUI编程就简单很多了

顶部