2013-04-04 3 views
0

Я пытаюсь реализовать качающуюся раму. В этом случае я хочу отобразить статус обработки в текстовой панели, используя другой поток, выполняя требуемую задачу. Я попробовал следующий код. Конечно, с логикой что-то не так. Пожалуйста, предоставьте мне с правильным подходомСостояние обработки Java Swing

import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class SampleSwing { 

private JFrame frame; 
public static JTextField textField; 
public static boolean processing=false; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       SampleSwing window = new SampleSwing(); 
       window.frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the application. 
*/ 
public SampleSwing() { 
    initialize(); 
} 

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 450, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    textField = new JTextField(); 
    textField.setBounds(0, 31, 434, 20); 
    frame.getContentPane().add(textField); 
    textField.setColumns(10); 

    JButton btnNewButton = new JButton("New button"); 
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      processing=true; 
      Processingstatus ps=new Processingstatus(); 
      ps.start(); 
      /*perform the actual task*/ 
      processing=false; 
     } 
    }); 
    btnNewButton.setBounds(174, 74, 89, 23); 
    frame.getContentPane().add(btnNewButton); 
} 
} 

class Processingstatus extends Thread{ 
public void run() { 
    try { 
     while(SampleSwing.processing) { 

      SampleSwing.textField.setText("Processing"); 
      Thread.sleep(1000); 
      SampleSwing.textField.setText("Processing.."); 
      Thread.sleep(1000); 
      SampleSwing.textField.setText("Processing..."); 
      Thread.sleep(1000); 
     } 
    } 
    catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

} 
+0

Возможно, покажите нам, что представляет собой текущее поведение? – giorashc

+0

Давайте начнем с [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) – MadProgrammer

+0

В настоящее время безупречно. Позвольте мне пройти второе предложение один раз. – se7en

ответ

2

Сначала я подумал: «Вы должны использовать SwingWorker, так как он имеет методы для обработки прогресса и обновления EDT ...»

Но когда я присмотрелся, вы действительно не заботитесь о самом процессе, вам просто нужно указать, где показать, что процесс запущен ... Это два отдельных объекта, которые связаны только потому, что один (обновления пользовательского интерфейса) будет работать до тех пор, пока другой работает.

Итак, вместо этого я использовал javax.swing.Timer. Это позволяет мне планировать события происходят каждые n миллисекунд и есть, вызвавший в EDT, красивой и чистой ...

enter image description here

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.SwingWorker; 
import javax.swing.Timer; 

public class SampleSwing { 

    private JFrame frame; 
    public static JTextField textField; 
    public static boolean processing = false; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        SampleSwing window = new SampleSwing(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public SampleSwing() { 
     initialize(); 
    } 
    private Timer processTimer; 

    private void initialize() { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 

     textField = new JTextField(25); 
     frame.add(textField, gbc); 

     processTimer = new Timer(500, new ActionListener() { 
      private StringBuilder dots = new StringBuilder(3); 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       dots.append("."); 
       if (dots.length() > 3) { 
        dots.delete(0, dots.length()); 
       } 
       textField.setText("Processing" + dots.toString()); 
      } 
     }); 

     JButton btnNewButton = new JButton("New button"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       if (!processing) { 
        processing = true; 
        processTimer.start(); 
       } else { 
        processTimer.stop(); 
        processing = false; 
        textField.setText(null); 
       } 
      } 
     }); 
     frame.add(btnNewButton, gbc); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
    } 
} 

пса По той причине, почему ваш исходный код Ждет» t работа, см. мой комментарий в разделе выше комментариев;)

+0

, что и является целью. Если возможно, предложите некоторые другие страницы, чтобы узнать «Параллельность в свинге», что немного легче понять, кроме оракулов! – se7en

+0

Ссылка на комментарий - лучший туз для начала. Отсюда вы можете просто начать поиск примеров SwingWorker – MadProgrammer

Смежные вопросы