2016-11-05 5 views
0

메신저 스윙에 매우 익숙하지만 슬라이더와 라벨을 만드는이 프로그램을 만들려고했습니다. 슬라이더가 이동하면 (형태 1에서 16) 레이블이 변경됩니다. 그러나 내 레이블이 업데이트되지 않고 대신 슬라이더를 슬라이드 할 때 스레드 예외 및 기타 오류가 발생합니다. 전체 코드는 다음과 같습니다.슬라이더가 라벨을 업데이트하지 않음

package edu.cuny.brooklyn.cisc3120; 

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

public class Gui extends JFrame { 
    private static final int limit = 4; 
    private static final int minInteger = 1; 
    private static final int maxInteger = 16; 

    private static JLabel currentGuess; 
    private static JSlider slider; 

    public Gui() 
    { 
     setLayout(new FlowLayout()); 

     JSlider slider = new JSlider(JSlider.HORIZONTAL, minInteger, maxInteger, 1); 
     add(slider); 

     slider.setMajorTickSpacing(1); 
     slider.setPaintLabels(true); 
     slider.setPaintTicks(true); 

     currentGuess = new JLabel("Current Guess: 1"); 
     add(currentGuess); 

     SliderEvent e = new SliderEvent(); 
     slider.addChangeListener(e); 
    } 

    public static class SliderEvent implements ChangeListener 
    { 
     public void stateChanged(ChangeEvent e) 
     { 
      currentGuess.setText("Current Guess: " + slider.getValue()); 
     } 

    } 

    public static void main(String[] args) 
    { 
     Gui guessingGame = new Gui(); 
     guessingGame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     guessingGame.setTitle("Guessing Game"); 
     guessingGame.setLocation(100, 100); 
     guessingGame.pack(); 
     guessingGame.setVisible(true); 
    } 
} 

나는 진동하기가 매우 쉽다는 것을 반복합니다. 그래서 내가 어리석은 실수를 저 지르면 나 한테 쉽게 가라.

+0

* "나는 스윙하기가 매우 새롭다는 것을 반복한다."* 크로스 플랫폼 GUI를 만드는 것은 진보 된 주제이며, 예외를 이해하고 해결하기 전에 익숙해 져야한다. [스택 추적이란 무엇이며 어떻게 응용 프로그램 오류를 디버그 할 수 있습니까?] (http://stackoverflow.com/q/3988788/418556) & [Null Pointer Exception이란 무엇이며 어떻게 수정합니까? 그것?] (http://stackoverflow.com/q/218384/418556) 또 다른 팁 : 항상 복사 및 붙여 넣기 오류 및 예외 출력! –

답변

1
private static JSlider slider; 

    public Gui() 
    { 
     setLayout(new FlowLayout()); 

     JSlider slider = new JSlider(JSlider.HORIZONTAL, minInteger, maxInteger, 1); 

한 번은 인스턴스 변수 (null)로, 한 번은 로컬 변수로 슬라이더를 두 번 정의합니다.

는 지역 변수를 제거하십시오 :

//JSlider slider = new JSlider(JSlider.HORIZONTAL, minInteger, maxInteger, 1); 
slider = new JSlider(JSlider.HORIZONTAL, minInteger, maxInteger, 1); 

또한, 당신은 모든 정적 변수를 사용해서는 안됩니다. 그것은 저조한 디자인을 나타냅니다. How to Use Sliders에있는 Swing 튜토리얼에서 더 나은 프로그램 구조를 보여줄 데모 코드를 찾아 보시기 바랍니다. 데모 코드를 다운로드하여 요구 사항에 맞게 수정하십시오.

관련 문제