frame里面一个按钮点了执行另外一个类程序的问题

在frame里面点一个按钮以后要执行的是另外一个类,这个类没有界面,就是命令行下的一段代码,发现可以执行,但是执行完这个代码以后,原来frame里面的程序执行的结果不会显示了,原来设计的是返回的结果在一个textarea里面显示的,这个程序确实是在运行的,结果也正确,就是不会显示了,而且frame也关闭不了了。

点那个按钮以后先执行的是new ChangeIP();这个类构造函数里面把动作都执行完了。

我又把这个动作用线程方式启动,也不行,原来的frame里面不会显示结果,但程序确实在运行,看不到每一步的结果,感觉程序死掉了一样,很不爽啊,请问这个应该怎么处理?
...全文
215 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
明白了,我把循环操作的动作放到一个线程里面,然后每一次post的动作也放到线程里面,可以了。谢谢!
teemai 2013-11-27
  • 打赏
  • 举报
回复
你需要把启动frame的线程单独启动,用单独线程去更新UI。 参考这个问题:http://www.iteye.com/problems/51628
  • 打赏
  • 举报
回复
1、我刚把post的也用线程方式启动试了一下,还是不行,照样得等循环结束才显示。 2、把改ip那个不用线程方式启动,也是得等到循环结束才显示。
  • 打赏
  • 举报
回复
现在关闭窗口什么的倒无所谓,关键是我输出信息的怎么办?我刚试了,他非要等循环结束了,才会把所有的信息在textarea里面显示,为什么不是一次循环就显示一个哪?
teemai 2013-11-27
  • 打赏
  • 举报
回复
另外你可以做个很简单的测试,程序运行的过程中,点一下关闭按钮。当程序执行结束就关了。 如果执行过程中你不点关闭。运行结束窗体还在。

postBut.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				if(arg0.getSource()==postBut){
					for(int i = 0;i<10;i++){
						Thread accept = new Thread(){ //定义Accept线程   
					        public void run(){
					        	System.out.println(new Date());
//					        	new ChangeIP();
					        }
						};
						accept.start();
						try{
							Thread.sleep(1000);//18秒一个机器 可以反应过来,否则ip还未生效。
						}catch(InterruptedException e){
							e.printStackTrace();
						}
//						try{
//							URL url = new URL("http://192.168.0.5/vote/search.php");
//						    URLConnection conn = url.openConnection();
//						    							
//						    conn.setDoOutput(true);
//						    conn.setDoInput(true);
//						    BufferedWriter br = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),"utf-8"));
//						    br.write(URLEncoder.encode("name","utf-8"));
//						    br.write("="); 
//						    br.write(URLEncoder.encode("张三","utf-8"));
//						    br.write("&");
//						    br.write(URLEncoder.encode("inst[0]","utf-8"));
//						    br.write("=");
//						    br.write(URLEncoder.encode("网络","utf-8"));
//						    br.write("&");
//						    br.write(URLEncoder.encode("inst[1]","utf-8"));
//						    br.write("=");
//						    br.write(URLEncoder.encode("打球","utf-8"));
//							br.flush();
//						    br.close();	    
//						    conn.getInputStream();
//						    
//						   
//						    //接受服务器返回数据
//						    BufferedReader br1 = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
//						    // 打印消息正文
//						    String line="";
//						    String result = "";
//						    while((line=br1.readLine())!=null) {
//						    	result += line + "\n";
//						    }
//						    br1.close();
//						    writeLog(result);
//						}catch(Exception e){
//							e.printStackTrace();
//						}
				    }
				}
			}
teemai 2013-11-27
  • 打赏
  • 举报
回复
你点了关闭按钮,这个事件在你的子线程都运行结束之后才会响应。 具体看看frame.setDefaultCloseOperation方法,里面有一个issue void javax.swing.JFrame.setDefaultCloseOperation(int operation) setDefaultCloseOperation public void setDefaultCloseOperation(int operation) Sets the operation that will happen by default when the user initiates a "close" on this frame. You must specify one of the following choices: DO_NOTHING_ON_CLOSE (defined in WindowConstants): Don't do anything; require the program to handle the operation in the windowClosing method of a registered WindowListener object. HIDE_ON_CLOSE (defined in WindowConstants): Automatically hide the frame after invoking any registered WindowListener objects. DISPOSE_ON_CLOSE (defined in WindowConstants): Automatically hide and dispose the frame after invoking any registered WindowListener objects. EXIT_ON_CLOSE (defined in JFrame): Exit the application using the System exit method. Use this only in applications. The value is set to HIDE_ON_CLOSE by default. Changes to the value of this property cause the firing of a property change event, with property name "defaultCloseOperation". Note: When the last displayable window within the Java virtual machine (VM) is disposed of, the VM may terminate. See AWT Threading Issues for more information. http://docs.oracle.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html Parameters: operation - the operation which should be performed when the user closes the frame Throws: IllegalArgumentException - if defaultCloseOperation value isn't one of the above valid values SecurityException - if EXIT_ON_CLOSE has been specified and the SecurityManager will not allow the caller to invoke System.exit See Also: Window.addWindowListener(java.awt.event.WindowListener), getDefaultCloseOperation(), WindowConstants, Runtime.exit(int) --------------------------------------------------------------------------------
  • 打赏
  • 举报
回复
引用 6 楼 huxiweng 的回复:
那你还是把代码发完整点。我本地能跑下测试下? ChangeIP也发一下
这是主程序界面:
package vote;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;



public class TestPost {
	public static void main(String[] args) throws Exception{
		new TestPost();
	}
	public TestPost()throws Exception{
		JFrame frame = new JFrame("自动投票程序");
		frame.setResizable(false);
		frame.setSize(new Dimension(400, 360));
		frame.setLayout(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocation(300, 200);
		frame.setVisible(true);
		final JButton ipBut = new JButton("添加ip数据库");
		final JButton postBut = new JButton("开始投票");
		final JTextArea resultText = new JTextArea("程序运行结果如下:\n");
		final JScrollPane resultPane = new JScrollPane(resultText,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		JLabel info = new JLabel("使用方法:先添加ip段数据,再开始投票!");
		
		frame.getContentPane().add(ipBut, null);
		frame.getContentPane().add(postBut, null);
		frame.getContentPane().add(resultPane, null);
		frame.getContentPane().add(info, null);		
		ipBut.setBounds(10, 10, 120, 30);
		postBut.setBounds(150, 10, 120, 30);
		resultPane.setBounds(10, 40, 380, 260);
		info.setBounds(10,300,350,30);
		ipBut.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				if(arg0.getSource()==ipBut){
					new AddIPDatabase();
				}
			}
		});
		postBut.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				if(arg0.getSource()==postBut){
					for(int i = 0;i<4000;i++){
						Thread accept = new Thread(){ //定义Accept线程   
					        public void run(){
					        	new ChangeIP();
					        }
						};
						accept.start();
						try{
							Thread.sleep(18000);//18秒一个机器 可以反应过来,否则ip还未生效。
						}catch(InterruptedException e){
							e.printStackTrace();
						}
						try{
							URL url = new URL("http://192.168.0.5/vote/search.php");
						    URLConnection conn = url.openConnection();
						    							
						    conn.setDoOutput(true);
						    conn.setDoInput(true);
						    BufferedWriter br = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),"utf-8"));
						    br.write(URLEncoder.encode("name","utf-8"));
						    br.write("="); 
						    br.write(URLEncoder.encode("张三","utf-8"));
						    br.write("&");
						    br.write(URLEncoder.encode("inst[0]","utf-8"));
						    br.write("=");
						    br.write(URLEncoder.encode("网络","utf-8"));
						    br.write("&");
						    br.write(URLEncoder.encode("inst[1]","utf-8"));
						    br.write("=");
						    br.write(URLEncoder.encode("打球","utf-8"));
							br.flush();
						    br.close();	    
						    conn.getInputStream();
						    
						   
						    //接受服务器返回数据
						    BufferedReader br1 = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
						    // 打印消息正文
						    String line="";
						    String result = "";
						    while((line=br1.readLine())!=null) {
						    	result += line + "\n";
						    }
						    br1.close();
						    writeLog(result);
						}catch(Exception e){
							e.printStackTrace();
						}
				    }
				}
			}
			public void writeLog(String logtext){
				resultText.append(logtext);
				resultText.setSelectionStart(resultText.getText().length());
				resultText.paintImmediately(resultText.getBounds());
		    }
		});
	    
	}	
}
这是changip的程序,文本文件里面每一行就是调用netsh修改ip的,每次取一行去执行。
package vote;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStreamWriter;
import java.util.Random;

public class ChangeIP {
	public static void main(String[] args) {
		new ChangeIP();
	}
	public ChangeIP(){
		String fileName = "resource/ipdatabase.txt";
		File file = new File(fileName);
		int fileLine = getRows(file)-1;
		Random r = new Random();
		int line = r.nextInt(fileLine)+1;
		//System.out.println(line);
		try {
			delRow(file,line);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void delRow(File file,int rowToDel) throws Exception{
		File temp = new File("resource/temp.txt");
		BufferedReader reader = new BufferedReader(new InputStreamReader(
		new FileInputStream(file)));
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
		new FileOutputStream(temp)));
		String str;
		int rowIndex = 1;
		while (null != (str = reader.readLine())){
			if (rowIndex != rowToDel){
				writer.write(str + "\r\n");
			}else{
				System.out.println(str);//此处执行更改ip操作
				Runtime.getRuntime().exec(str);
			}
			rowIndex++;
		}
		reader.close();
		writer.close();
		file.delete();// 删除原文件
		temp.renameTo(file);// 临时文件改名成原文件名称
	}
	public static int getRows(File file){
	     LineNumberReader  lnr = null;
	     int num = 0;
	     try {
	    	 lnr = new LineNumberReader(new FileReader(file));
	    	 lnr.skip(Long.MAX_VALUE);
	    	 num = lnr.getLineNumber();
	     } catch (FileNotFoundException e) {
	    	 e.printStackTrace();
	     } catch (IOException e) {
	    	 e.printStackTrace();
	     } finally {
	    	 try {
	    		 lnr.close();
	    	 } catch (IOException e) {
	    		 e.printStackTrace();
	    	 }
	     }
	     return ++num;
	}
}
teemai 2013-11-27
  • 打赏
  • 举报
回复
那你还是把代码发完整点。我本地能跑下测试下? ChangeIP也发一下
  • 打赏
  • 举报
回复
引用 3 楼 huxiweng 的回复:
你这循环开启4000个线程,你这里的new ChangeIP();做了多少事情?? 这里和界面没啥关系。你把4000改成10或者更小试试。
4000个ip地址啊,每次执行new ChangeIP();换一个ip。 我刚试了,即使改成10,甚至是1都不行,如果我不执行new ChangeIP();就是先用目前的ip去做post,结果什么的都正确,没问题,只要是执行了new ChangeIP();感觉好像是frame这个线程就不动了,连关闭的按钮都点了没反应了。
teemai 2013-11-27
  • 打赏
  • 举报
回复
引用 3 楼 huxiweng 的回复:
你这循环开启4000个线程,你这里的new ChangeIP();做了多少事情?? 这里和界面没啥关系。你把4000改成10或者更小试试。
先测试下和线程个数是否有关系
teemai 2013-11-27
  • 打赏
  • 举报
回复
你这循环开启4000个线程,你这里的new ChangeIP();做了多少事情?? 这里和界面没啥关系。你把4000改成10或者更小试试。
  • 打赏
  • 举报
回复
引用 1 楼 huxiweng 的回复:
一般更新了jframe,需要repaint一下。 你把frame代码和按钮事件的代码发一下吧。 ps:楼主太抠门了,这么多分,问个问题20分,怎么也得200分啊。。
postBut.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				if(arg0.getSource()==postBut){
					for(int i = 0;i<4000;i++){
						Thread accept = new Thread(){    
					        public void run(){
					        	new ChangeIP();
					        }
						};
						accept.start();						
						try{
							//....模拟post代码
						}catch(Exception e){
							e.printStackTrace();
						}
				    }
				}
			}
		});
那个ChangeIP类就是在构造函数里面执行一些修改机器ip的代码,没有用frame界面。 p.s.比较愚笨,问题比较多,入不敷出啊,所以要省着用,下次改40分,呵呵
teemai 2013-11-27
  • 打赏
  • 举报
回复
一般更新了jframe,需要repaint一下。 你把frame代码和按钮事件的代码发一下吧。 ps:楼主太抠门了,这么多分,问个问题20分,怎么也得200分啊。。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧