2016-10-13 2 views
0

다른 클래스의 레이블을 표시하려고합니다. 그러나 프레임에 추가하면 표시되지 않습니다. 나는 프레임 워크를 통과함으로써 카운터 클래스 자체에서 드로잉을 시도했다. 프레임 워크는 좋은 연습이 아니라고 가정한다 (실제로 작동하지 않는다는 사실을 무시하고). 뿐만 아니라 아래 코드에 무엇입니까. 아무도 나를 도울 수 없으며 내 솔루션이 생성 된 레이블을 표시하지 않는 이유를 설명 할 수 있습니까? 당신은 내가 JPanel을 사용하는 것에 대해 매우 새로운 것이라고 말할 수있을 것입니다.다른 클래스의 JLabel이 그려지지 않습니다.

CookieChaser Class 

public class CookieChaser extends JPanel { 

    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame("Cookie Chaser"); 
     CookieChaser game = new CookieChaser(); 
     frame.add(game); 
     frame.setSize(1000, 1000); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     counter Score = new counter(frame); 
     cookie Cookie = new cookie(); 
     JLabel item = counter.getLabel(); 
     frame.add(item); 
     frame.setVisible(true); 

     while (true) { 
      game.repaint(); 
      Thread.sleep(10); 
     } 
    } 
    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
     RenderingHints.VALUE_ANTIALIAS_ON); 
    } 
} 

카운터 클래스

public class counter { 
    int count; 
    static JLabel text; 

    public counter(JFrame frame){ 
     count = 0; 
     text = new JLabel(String.valueOf(count)); 
     text.setLocation(0,0); 
     text.setSize(50,50); 
    } 

    public static JLabel getLabel(){ 
     return text; 
    } 
+1

1) JLabel을 컨테이너에 추가해야합니다. 2) 페인트 방법으로 페인트 칠하지 않습니다. 3) paint 메소드는 대신 paintComponent 여야합니다. –

답변

1

나는 다음과 같은 스윙 GUI를 생성하는 코드를 수정했습니다. 나는 스윙 게임이나 응용 프로그램을 만들 때마다

enter image description here

, 나는 모델/뷰/컨트롤러 패턴을 사용합니다. 즉, GUI 모델을 만듭니다. GUI 모델에는 GUI에 필요한 모든 필드가 들어 있습니다. 그런 다음, GUI 모델에서 값을 읽는 GUI보기를 작성합니다. 마지막으로 GUI 모델을 업데이트하고 GUI보기를 새로 고치거나 다시 그리는 하나 이상의 GUI 컨트롤러를 만듭니다.

나는 코드에 다음과 같이 변경했다 :
  1. 는 내가 GUI 모델을 만들었습니다. Counter 클래스를 만들었습니다. 모든 카운터 클래스에는 카운터 값이 있습니다.

  2. 나는 GUI 모델을 사용하는 GUI보기를 만들었습니다. 뷰 클래스에서 JFrame, JPanel 및 JLabel을 모두 만들었습니다. 하나 이상의 클래스를 사용하여보기를 만들 수 있습니다. 이 견해는 간단했기 때문에 모든 것을 하나의 수업으로 만들었습니다.

  3. 모든 Swing 응용 프로그램은 SwingUtilities invokeLater 메서드를 호출해야합니다. invokeLater 메서드는 Swing 구성 요소의 생성 및 업데이트를 Event Dispatch thread에 넣습니다. 오라클과 저는 모든 스윙 애플리케이션이 이런 식으로 시작한다고 주장합니다.

  4. 나는 JLabel 업데이트를 볼 수 있도록 별도의 애니메이션 실행 파일을 만들었습니다. 카운터를 1 초마다 증가시킵니다.

  5. Animation 클래스의 repaint 메서드는 SwingUtilities invokeLater 메서드를 호출하여 JLabel 업데이트가 Event Dispatch 스레드에서 수행되도록합니다. 애니메이션 루프는 GUI를 응답 성있게 유지하기 위해 별도의 스레드에서 실행됩니다.

다음은 수정 된 코드입니다.

package com.ggl.testing; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class CookieChaser implements Runnable { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new CookieChaser()); 
    } 

    private JLabel counterLabel; 

    @Override 
    public void run() { 
     Counter counter = new Counter(); 

     JFrame frame = new JFrame("Cookie Chaser"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     counterLabel = new JLabel(" "); 
     mainPanel.add(counterLabel); 

     frame.add(mainPanel); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 

     new Thread(new Animation(this, counter)).start(); 
    } 

    public void setCounterLabel(String text) { 
     counterLabel.setText(text); 
    } 

    public class Counter { 
     private int counter; 

     public int getCounter() { 
      return counter; 
     } 

     public void setCounter(int counter) { 
      this.counter = counter; 
     } 

     public void incrementCounter() { 
      this.counter++; 
     } 
    } 

    public class Animation implements Runnable { 

     private Counter counter; 

     private CookieChaser cookieChaser; 

     public Animation(CookieChaser cookieChaser, Counter counter) { 
      this.cookieChaser = cookieChaser; 
      this.counter = counter; 
     } 

     @Override 
     public void run() { 
      while (true) { 
       counter.incrementCounter(); 
       repaint(); 
       sleep(1000L); 
      } 
     } 

     private void repaint() { 
      SwingUtilities.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        cookieChaser.setCounterLabel(Integer.toString(counter 
          .getCounter())); 
       } 
      }); 
     } 

     private void sleep(long duration) { 
      try { 
       Thread.sleep(duration); 
      } catch (InterruptedException e) { 

      } 
     } 
    } 
} 
관련 문제