2013-07-07 48 views
5

Ok, vì vậy tôi đã thực hiện một chương trình đơn giản cho biết thêm giá trị để truy cập mỗi khi nút được nhấp. Bây giờ, tôi muốn thêm tính năng nút "Tự động" để tăng giá trị của bộ đếm khi nút "Tự động" được nhấp. Tôi đang gặp vấn đề với nó bởi vì nó sẽ không làm cho mỗi giá trị truy cập trên màn hình, thay vì giá trị cập nhật khi vòng lặp được thực hiện .. Đây là mã của tôi:Nút ActionListener

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.concurrent.TimeUnit; 
import javax.swing.JButton; 
import javax.swing.JFrame; 


public class Gui extends JFrame{ 

    private static final long serialVersionUID = 1L; 

    private JButton uselesButton; 

    private JButton autoButton; 

    private FlowLayout layout; 
    private long counter = 0; 

    public Gui() { 
     super("Button"); 
     layout = new FlowLayout(FlowLayout.CENTER); 
     this.setLayout(layout); 

     uselesButton = new JButton(String.format("Pressed %d times", counter)); 
     add(uselesButton); 
     uselesButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       counter++; 
       uselesButton.setText(String.format("Pressed %d times", counter)); 
      } 

     }); 

     autoButton = new JButton("Auto"); 
     add(autoButton); 
     autoButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
         for(long i =0; i < 99999999;i++) { 
         try { 
          TimeUnit.MILLISECONDS.sleep(10); 
         } catch (InterruptedException e1) { 
          System.out.println("ERROR"); 
         } 
         counter = i; 
         uselesButton.setText(String.format("Pressed %d times", counter)); 
        } 
        } 
     }); 
    } 
} 

Hãy nhớ rằng tôi người mới bắt đầu ... Tất cả trợ giúp đều được đánh giá cao :)

+0

câu hỏi là gì? – Sello

+1

* Chính xác * nút tự động được cho là đang làm gì? –

+3

Tôi nghĩ [Swing Timer] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) sẽ giải quyết vấn đề này. – Azad

Trả lời

4

Hãy xem các hướng dẫn về Làm thế nào để sử dụng Swing Timer và sau đó nhìn vào giải pháp của tôi:

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

public class Gui extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JButton uselesButton; 
    private JButton autoButton; 
    private FlowLayout layout; 
    private long counter = 0; 
    private javax.swing.Timer timer; 

    public Gui() { 
     super("Button"); 
     layout = new FlowLayout(FlowLayout.CENTER); 
     setLayout(layout); 
     setDefaultCloseOperation(3); 
     setSize(300, 300); 
     setLocationRelativeTo(null); 

     //initialing swing timer 
     timer = new javax.swing.Timer(100, getButtonAction()); 

     autoButton = new JButton("Auto"); 
     add(autoButton); 
     autoButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (!timer.isRunning()) { 
        timer.start(); 
       } else { 
        timer.stop(); 
       } 
      } 
     }); 
    } 

    private ActionListener getButtonAction() { 
     ActionListener action = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       autoButton.setText(String.format("Pressed %d times", ++counter)); 
       if (counter > 1000) { 
        timer.stop(); 
       } 
      } 
     }; 
     return action; 
    } 

    public static void main(String... args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Gui().setVisible(true); 
      } 
     }); 
    } 
} 
0

vấn đề ở đây là hệ thống đang trong vòng lặp, do đó, nó không thể vẽ các thay đổi. để thực hiện điều đó, bạn cần phải mở một chuỗi mới. chuỗi mới sẽ thực hiện vòng lặp và chuỗi chính sẽ vẽ lại biểu mẫu.

một điều nữa, bạn không nên ngủ trên sợi chính. bạn có thể sử dụng một bộ đếm thời gian sẽ đánh dấu mỗi 10 phần nghìn giây thay vì sleep(10) here là một ví dụ

+2

Sẽ không phải là một Timer Swing là một lựa chọn tốt hơn? –

+1

Bạn đã thử nghiệm các đề xuất của mình chưa? 'repaint()' sẽ không làm điều gì trong trường hợp một vòng lặp buộc lên EDT. Vui lòng xóa đề xuất này để tôi có thể xóa bỏ phiếu bầu. –

+0

Ngoài ra, chủ đề vẽ không phải là chủ đề chính. Đó là chuỗi gửi sự kiện. –

0

khối mã của bạn thread GUI (EDT) khi nhập bên trong vòng lặp này (GUI sẽ treo, nút sẽ không cập nhật cho đến khi bạn hoàn thành), do đó bạn nên thêm mã của bạn bên trong một thread công nhân:

autoButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
        new Thread(new Runnable() { 
         @Override 
         public void run() { 
          for(long i =0; i < 99999999;i++) { 
           try { 
            TimeUnit.MILLISECONDS.sleep(10); 
           } catch (InterruptedException e1) { 
            System.out.println("ERROR"); 
           } 
           counter = i; 

           java.awt.EventQueue.invokeLater(new Runnable() { 
             public void run() { 
             uselesButton.setText(String.format("Pressed %d times", counter)); 
             } 
           }); 
          } 
         } 
        }).start(); 
      } 
     }); 
Các vấn đề liên quan