2014-11-07 2 views
0

내가 작성한 일부 코드에 문제가 있습니다. Main에서 paintComponent 메서드로 변경하려고 시도하지만 비 정적 메서드에 대한 정적 참조를 만들 수 없다고합니다. 나는 그것이 무엇을 말하는지 이해한다고 생각하지만, 나는 이것에 대해 어떻게 확신 할 수 있는지 모르겠습니다. 클래스는 다음과 같습니다.Repaint()가 비 정적 메서드에 대한 정적 참조를 만들 수 없습니까?

import javax.swing.JFrame; 
import java.awt.Graphics; 

public class Main extends JFrame{  
    /** 
    * 
    */ 
    private static final long serialVersionUID = -4511248732627763442L; 

    public static void main(String[] args){  

     frame();   
     repaint();  
     move();   
    } 

    public static void frame(){ 

     JFrame frame = new JFrame("Hunter VS Hunted");   
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH);   
     frame.setVisible(true);        
     frame.setResizable(false);       
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  


    } 

    public void paintComponent(Graphics g){ 

     super.paintComponents(g); 
     Hunter.paint(g);    
     Hunted.paint(g);    


    } 

    public static void move(){ 

     Hunter.move();   
     Hunted.move();      

    } 
} 

이 클래스의 헌터와 사냥은 두 개의 외부 클래스입니다. main 메소드에서 repaint()에 오류가 발생하고 조언이나 방향이 많이 알려졌다.

+0

당신의'repaint()'메소드는 인스턴스 메소드이기 때문에 인스턴스에서 호출해야합니다. 어떤 인스턴스에서 호출하고 싶습니까? 당신은 실제로 어떤 순간도 창조하지 않고 있습니다. –

+0

'repaint'는 인스턴스 메소드'JFrame'입니다. 메소드를 호출하려면 클래스의 인스턴스가 필요합니다. 또한'JFrame'에서 확장하지만 ('정적'?)'frame' 메서드에서 두 번째'JFrame'을 작성하므로'Main '에서'repaint'를 호출 할 수 있더라도 아무 것도 가질 수 없습니다 효과. GUI에서'static'을'정적으로 '만드는 것을 멈추십시오 == 나쁜 디자인 – MadProgrammer

답변

0

같은 이유는 Component 클래스에서 repaint 메서드는 정적이 아닌 메서드이기 때문입니다.

public static JFrame frame(){ 
    JFrame frame = new JFrame("Hunter VS Hunted");   
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);   
    frame.setVisible(true);        
    frame.setResizable(false);       
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    return frame; 
} 

당신이 수 주 방법 :

Main myMain = new Main(); 
myMain.repaint(); 

또는 프레임 방식에서 생성 JFrame의에 그것을 사용하는 당신의 의도 경우 다음과 같이 할 수 있습니다 : 당신은 무엇인가가 수행 할 수 있습니다 do like :

JFrame frame = frame(); 
frame.repaint(); 
+3

OP는'JFrame'에서 확장되지만 내부적으로 또 다른'JFrame'을 생성하므로'Main'에서'repaint'를 호출하십시오 '는 아무런 영향을 미치지 않을 것입니다. – MadProgrammer

+0

예. 사용자가 repaint 메서드를 호출하기 전에 그가 만든 프레임에서 만든 프레임을 사용하려고합니다. 다른 클래스에서도 사용할 수 있습니다. – SMA

+0

나는 OP에 아무런 생각이 없다고 생각합니다 ... – MadProgrammer

0

정적 메서드와 인스턴스 메서드의 차이점을 이해해야합니다.

정적 메서드는 특정 개체의 상태와 관련이없는 작업을 수행합니다. 그들은 새로운 객체를 생성하거나, 주어진 매개 변수에 대해 연산을 수행하거나, 정적 필드를 조작 할 수 있습니다.

그러나 이들은 클래스에 존재하며 특정 개체와 관련이 없습니다.

스윙을 사용하려면 실제 패널, 버튼 및 기타 구성 요소와 같은 실제 개체를 만듭니다. 각각은 하나의 객체이며 동일한 클래스의 많은 객체가있을 수 있습니다 (다수 Button, 많은 Frames). 각 객체의 상태는 동작 방식을 결정합니다. 하나의 버튼을 누르면 한 가지 작업이 수행되고 다른 작업은 다른 작업을 수행합니다. 하나는이 색을, 다른 하나는 색을 가지고 있습니다.

따라서 동작은 repaint()이거나 동작 수신기를 설정하는 것은 하나의 특정 개체, 단추, 패널 등 전체 클래스에 적용되는 동작이 아닙니다.

은 따라서, 귀하의 HuntedHunter 클래스의 행동은 hunter = new Hunter(...)hunted = new Hunted()으로 만든 특정 인스턴스의 전망으로 작성되어야하며, 그 방법은 클래스에서 직접적으로 객체에 대한 참조로 호출 할 필요가 이러한 방법 때문에 화면에 그려지는 특정 물체의 상태와 관련이 있습니다.

메인이 JFrame이되기를 원하는지 확실치 않습니다. 하지만 그렇게 할 경우 new Main()을 만들고 구성 요소를 추가해야합니다. 일부 JFrame을 만든 다음 paintComponent() 메서드를 Main() 메서드로 작성 했으므로이 메서드를 적용해야합니다.

당신은 JFrame을 만들고 Hunter (new Hunter()으로 만든)와 Hunted (new Hunted()으로 만든)의 두 가지 구성 요소를 추가하고 쓰기를 할 때 각 구성 요소가 서로 어떻게 관련되어 있는지 고려하기 만하면됩니다 그들의 (비 정적!) 메소드.

관련 문제