2012-03-17 2 views
3

단순한 레이블과 버튼이라는 2 가지 요소 만있는 간단한 GUI 양식을 만들려고합니다. 버튼에 표시된 텍스트는 '시작'입니다. 레이블에 기본적으로 0이 표시됩니다.Java - 스윙에서 만든 GUI 업데이트

  1. 카운터는 1 초에 0에서 1로 증가 시작한다

    I 버튼 다음 작업이 수행된다 시작을 클릭

    .
  2. 시작 단추에 표시된 텍스트는 중지로 변경됩니다.
  3. 다시 같은 단추 (캡션을 중지로 표시)를 클릭하면 증가분이 중지됩니다.
  4. 버튼의 텍스트가 시작으로 변경됩니다. 등등 ...

Netbeans에서 내 응용 프로그램을 개발 중입니다. Main.java의

public class AGC extends javax.swing.JFrame 
{ 
    public AGC() 
    {  
     initComponents(); 
    } 

    public static void main(String args[]) 
    { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() 
      { 
       new AGC().setVisible(true); 
      } 
     }); 
    } 

    private javax.swing.JButton btnStartStop; // name of start stop button 
    private javax.swing.JLabel lblCounter; // name of the label 

} 

목차된다 :

public class Main 
{ 
    public static int count = 0; 
    public static boolean started = false; 
} 

I 상기 도면에 도시 된 바와 같이

2 개 된 .java 파일

AGC.java의

내용있다있다 다음 논리를 구현하고 싶습니다.

private void btnStartStopMouseClicked(java.awt.event.MouseEvent evt) 
{ 
    if (Main.stared == true) 
    { 
     // logic to start counting 
    } 
    else 
    { 
     // logic to stop counting 
    } 
} 

내 문제는 이것입니다 :

  1. 1 초마다 lblCounter를 업데이트하는 방법은 무엇입니까?
  2. 1 초 타이머를 시작하려면 어떤 논리를 구현해야하며 해당 방법에서 lblCounter에 액세스하는 방법은 무엇입니까?

친절히 도움. 작업 코드는 매우 높이 평가 될 것입니다. 미리 감사드립니다. 제이

+0

반납하시기 바랍니다. 나는 같은 것을 제공 할 수있을 것이다. – Jay

+0

작동하는 샘플 코드를 추가했는데, 이것이 원하는 것입니까? –

답변

6

은 단순히 당신이 일을하는 javax.swing.Timer 사용하고, 하나 ActionListener을합니다. 여기

:-) 작업 코드 예제 나에게 십 분 보내기 추가 지원에 대한 샘플 프로그램입니다 :

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class UpdateWithTimer extends JFrame 
{ 
    private Timer timer; 
    private JButton startStopButton; 
    private JLabel changingLabel; 
    private int counter = 0; 
    private boolean flag = false; 
    private ActionListener timerAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      counter++; 
      changingLabel.setText("" + counter); 
     } 
    }; 

    private ActionListener buttonAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      if (!flag) 
      { 
       startStopButton.setText("STOP TIMER"); 
       timer.start(); 
       flag = true; 
      } 
      else if (flag) 
      { 
       startStopButton.setText("START TIMER"); 
       timer.stop(); 
       flag = false; 
      } 
     } 
    }; 

    private void createAndDisplayGUI() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationByPlatform(true); 

     JPanel contentPane = new JPanel(); 
     changingLabel = new JLabel("" + counter); 
     contentPane.add(changingLabel); 

     startStopButton = new JButton("START TIMER"); 
     startStopButton.addActionListener(buttonAction); 

     add(contentPane, BorderLayout.CENTER); 
     add(startStopButton, BorderLayout.PAGE_END); 

     timer = new Timer(1000, timerAction); 

     setSize(300, 300); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new UpdateWithTimer().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

당신은 카운터가 다시 단순히 타이머를 중지에 다시 0으로 되돌리려면 buttonActionactionPerformed(...) 방법

else if (flag) 
{ 
    startStopButton.setText("START TIMER"); 
    timer.stop(); 
    flag = false; 
    counter = 0; 
    changingLabel.setText("" + counter); 
} 

이 부분을 추가합니다.

+0

고맙습니다. Gagandeep. 내 하루가 너무 좋았어. 이제이 문제를 해결하고 시뮬레이션 설계를 진행할 수 있습니다. 다시 한번 감사드립니다. – Jay

+0

@ 제이 : 당신은 대부분 환영합니다. –

2

좋아, 그럼 제가 제안하는 것은 SwingWorker입니다. SwingWorker를 확장하고 doBackground()에서 으로 a while(!isCancelled()) 루프를 실행합니다. 절전 실행 후 레이블 값을 증가시키는 속성 변경을 실행하기 만하면됩니다.

중지 버튼을 누를 때마다 현재 스윙 작업자를 취소하십시오.시작 버튼을 누르면 execute() 스윙 워킹

관련 문제