一般更新了jframe,需要repaint一下。你把frame代码和按钮事件的代码发一下吧。ps:楼主太抠门了,这么多分,问个问题20分,怎么也得200分啊。。

解决方案 »

  1.   

    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分,呵呵
      

  2.   

    你这循环开启4000个线程,你这里的new ChangeIP();做了多少事情??这里和界面没啥关系。你把4000改成10或者更小试试。
      

  3.   

    4000个ip地址啊,每次执行new ChangeIP();换一个ip。
    我刚试了,即使改成10,甚至是1都不行,如果我不执行new ChangeIP();就是先用目前的ip去做post,结果什么的都正确,没问题,只要是执行了new ChangeIP();感觉好像是frame这个线程就不动了,连关闭的按钮都点了没反应了。
      

  4.   

    那你还是把代码发完整点。我本地能跑下测试下?
    ChangeIP也发一下
      

  5.   

    这是主程序界面:
    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;
    }
    }
      

  6.   

    你点了关闭按钮,这个事件在你的子线程都运行结束之后才会响应。具体看看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)
    --------------------------------------------------------------------------------
      

  7.   

    另外你可以做个很简单的测试,程序运行的过程中,点一下关闭按钮。当程序执行结束就关了。
    如果执行过程中你不点关闭。运行结束窗体还在。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();
    // }
        }
    }
    }
      

  8.   

    现在关闭窗口什么的倒无所谓,关键是我输出信息的怎么办?我刚试了,他非要等循环结束了,才会把所有的信息在textarea里面显示,为什么不是一次循环就显示一个哪?
      

  9.   

    1、我刚把post的也用线程方式启动试了一下,还是不行,照样得等循环结束才显示。
    2、把改ip那个不用线程方式启动,也是得等到循环结束才显示。
      

  10.   

    你需要把启动frame的线程单独启动,用单独线程去更新UI。
    参考这个问题:http://www.iteye.com/problems/51628
      

  11.   

    明白了,我把循环操作的动作放到一个线程里面,然后每一次post的动作也放到线程里面,可以了。谢谢!