2014-02-14 4 views
0

'이름에 구성 요소에 개인 액세스 권한이 있습니다.'라는 오류가 발생했습니다. 나는 그것이 의미하는 것을 이해하지 못한다. 그러나 나는 main 메소드에서 변수 'name'을 잘못 초기화했다고 생각한다. 이 오류는 startGame() 메소드 내부에서 'label1'을 초기화하는 지점을 가리 킵니다.오류 받기 : 구성 요소에서 변수 private 액세스

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

public class Gamey extends JFrame 
{ 
private JPanel panelUp; 
private JPanel panelDown; 
private JButton btnPlay, btnNext; 
private JLabel label1; 

public Gamey() 
{ 
    super("Game"); 
    startGame(); 
} 

public void startGame() 
{ 
    Container c = getContentPane(); 
    panelUp = new JPanel(); 
    panelDown = new JPanel(); 
    label1 = new JLabel(name + "Snow glows white on the mountain tonight"); //name has a private access in Component 
    btnPlay = new JButton("Play"); 
    btnNext = new JButton("Next"); 

    btnPlay.addActionListener(new Handler()); 

    panelUp.add(label1); 
    panelDown.add(btnPlay); 

    c.add(panelUp, BorderLayout.CENTER); 
    c.add(panelDown, BorderLayout.PAGE_END); 


} 

public class Handler implements ActionListener 
{ 


    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource() == btnPlay) 
     { 
      btnPlay.setText("Next"); 
      label1.setText("Not a footprint to be seen"); 

     } 

    } 

} 




public static void main(String[] args) 
{ 
    String name = JOptionPane.showInputDialog(null, "enter name: "); 
    Gamey game = new Gamey(); 

    game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    game.setSize(450,450); 
    game.setVisible(true); 
    game.setLocationRelativeTo(null); 
} 

} 

답변

1

클래스 Gamey 인 - 턴 Component 클래스를 연장 JFrame 클래스를 확장합니다. startGame() 메서드에서이 문에 name이라는 필드를 사용했습니다. 당신의 Gamey 클래스에서 해당 이름의 어떤 인스턴스 변수가 없기 때문에

label1 = new JLabel(name + "Snow glows white on the mountain tonight"); 

, 그것은 이러한 필드를 확인 할 수있는 계층 구조를 사라와 Component 클래스의 하나 개의 선물을 발견했다. 그러나이 필드 nameprivate 액세스 한정자를 가지고 있으며, 그것은 당신이

name has a private access in Component. 

이 오류를 제거하려면 오류가 발생, 중 당신의 Gamey 클래스의 name 필드를 선언하거나 startGame()의 요구 사항에 따라하는 이유입니다 .

참고 : 코드가 뒤죽박죽이지만 메서드에서 변수가 name 인 것으로 나타났습니다. 이 인스턴스 변수를 인스턴스 변수로 만들고 메서드에서 해당 값을 채우면 startGame() 메서드에서 사용할 수 있습니다. 다음과 같이 입력하십시오 :

public class Gamey extends JFrame { 
    // Other fields 
    private String name; 
    // Getter & setter for name 

    ... 

    public static void main(String[] args) { 
     Gamey game = new Gamey(); 
     game.setName(JOptionPane.showInputDialog(null, "enter name: ")); // Set the name with the value from the input dialog 
    ... 
    } 
} 
+0

Ok 제안 사항을 준수합니다. 감사! 그러나 또 다른 것이 있습니다. 그것은 컴파일되었지만 name 변수는 다음과 같이 null을 표시했습니다. nullSnow는 오늘 밤에 산에서 하얀 빛을냅니다. 왜 그렇게합니까? – Smee

관련 문제