2014-12-21 2 views
0

온라인 Java 클래스에서 프레임 내의 단추에 대한 마우스 클릭 수를 계산하는 프로그램을 작성해야합니다. 여기 내 코드는 다음과 같습니다.Java 기본 GUI 프로그램 오류

import java.awt.*; 
import java.awt.event.*; 

public class option1 extends Frame { 
    option1() { 
     setTitle("Final Project Option 1"); 
     setSize(300,300); 
     show(); 
    } 
    public static void main(String[] args) { 
     option1 test = new option1(); 

     int a = 0; 
     String s1 = "" + a; 

     Frame objFrame; 
     Button objButton1; 
     Label objLabel1; 

     objFrame = new option1(); 
     objButton1 = new Button("Button"); 
     objLabel1 = new Label(); 

     objLabel1.setBounds(150,220,50,30); 
     objButton1.setBounds(40,35,50,50); 

     objLabel1.setText(s1); 

     objButton1.addMouseListener(new MyMouseListener()); //line 29 

     objFrame.add(objLabel1); 
     objFrame.add(objButton1); 
    } 
    public class MyMouseListener extends MouseAdapter { 
     public void mouseClicked(MouseEvent me) { 
      a++; //line 36 
     } 
    } 
} 

컴파일 할 때 두 가지 오류가 발생합니다. 하나의 오류는 "정적 컨텍스트에서 참조 할 수없는 비 정적 변수"인 29 행과 36 행의 "기호를 찾을 수 없음"행 중 하나입니다.

그래서 내가 뭘 잘못하고있는 걸까요? 응답자가 문제를 해결하기 위해해야 ​​할 일을 정확하게 말하고 프로그래밍에 익숙하지 않기 때문에 기술 용어 사용을 피하는 데 감사드립니다.

+0

난 당신이 더 나은 자바 언어의 기본을 찾기 시작 생각 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/ 다음 특별히이 http://docs.oracle.com/javase/ 자습서/java/javaOO/index.html –

+0

및이 http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html http://docs.oracle.com/javase/tutorial/java /javaOO/innerclasses.html –

답변

0

나는 당신의 코드를 작동 시키려고 노력했다. 그러나 표준 Java 코딩과 관련하여 몇 가지 문제가 있습니다. 그러나 코딩 스타일에 관한 이전 답변을 고려해야합니다.

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

public class Main { 

public static void main(String[] args) { 

    final Frame mainFrame = new OptionOne(); 
    Button button = new Button("Button"); 
    final Label label = new Label(); 

    label.setBounds(150, 220, 50, 30); 
    label.setText("0"); 
    button.setBounds(40, 35, 50, 50); 

    label.addPropertyChangeListener(label.getText(), new PropertyChangeListener() { 
     @Override 
     public void propertyChange(PropertyChangeEvent evt) { 
      mainFrame.addNotify(); 
     } 
    }); 

    button.addMouseListener(new MouseListener() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      int value = Integer.parseInt(label.getText()); 
      label.setText(String.valueOf(value + 1)); 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 

     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 

     } 

     @Override 
     public void mouseEntered(MouseEvent e) { 

     } 

     @Override 
     public void mouseExited(MouseEvent e) { 

     } 
    }); 

    mainFrame.add(label); 
    mainFrame.add(button); 
} 
} 

class OptionOne extends Frame { 

    OptionOne() { 
    setTitle("Final Project Option 1"); 
    setSize(300, 300); 
    show(); 
    } 
} 
+2

왜 레이블의 모든 PropertyChange 이벤트에서 addNotify를 호출합니까? 혹시 addNotify를 호출해야합니다 ... – MadProgrammer

+0

물론, 필요하지 않습니다. @MadProgrammer 감사합니다. – utnas

1

나는, 즉 내면의 클래스는 (아마도 자바 명명 규칙에 맞게 Option1을해야 option1의 인스턴스없이 사용하는) static해야한다,이 문제를보고 정의하고 a를 초기화해야합니다. 또한

public static class MyMouseListener extends MouseAdapter { 
    int a = 0; //<-- add this. 
    public void mouseClicked(MouseEvent me) { 
     a++; 
    } 
} 

같은 뭔가, 내가 대신 Frame 이전의 현대 JFrame 사용을 고려하는 것이 좋습니다.

편집

당신은

MyMouseListener mml = new MyMouseListener(); 
objButton1.addMouseListener(mml); 

처럼 MouseListener에 대한 참조를 저장해야합니다 그럼 당신은 그것에게 a 마지막으로

System.out.println(mml.a); 

처럼, 원래의 접근 방식을 얻을 수 있습니다 "" + a의 값은 "0"이됩니다.

빨리 당신이 가능, 비 정적 컨텍스트로 main 방법에서 얻을 수있는 일반적
+0

내부 클래스를 정적으로 만들고 내부 클래스 아래로 "int a = 0"을 이동하려고 시도했습니다.하지만 지금은 컴파일 할 때 다른 오류가 있습니다 : "String s1 =" "+ a;"줄에 "심볼을 찾을 수 없습니다"라는 오류가 나타납니다. – randomguy537

+0

@ randomguy537 편집 됨. 분명히'a'는 리스너의 일부입니다; 변수 범위를 읽어야합니다. –

1

, ... 일반적으로

  • public class option1 extends Frame { 
        private int a = 0; 
        private Label objLabel1; 
        option1() { 
         setTitle("Final Project Option 1"); 
         setSize(300,300); 
    
    
         Button objButton1; 
    
         objButton1 = new Button("Button"); 
         objLabel1 = new Label(); 
    
         objLabel1.setBounds(150,220,50,30); 
         objButton1.setBounds(40,35,50,50); 
    
         objLabel1.setText(Integer.toString(a)); 
    
         objButton1.addMouseListener(new MyMouseListener()); //line 29 
    
         add(objLabel1); 
         add(objButton1); 
    
         show(); 
        } 
        public static void main(String[] args) { 
         option1 test = new option1(); 
        } 
        public class MyMouseListener extends MouseAdapter { 
         public void mouseClicked(MouseEvent me) { 
          a++; //line 36 
          objLabel1.setText(Integer.toString(a)); 
         } 
        } 
    } 
    
    는, AWT 일부가 오래된 (이다 15 년) Swing 또는 JavaFX를 대신 사용해야합니다. 마우스가 버튼을
  • 당신은 Code Conventions for the Java TM Programming Language을 통해 읽기를하는 것 같아서 트리거 될 수있는 유일한 방법은 아닙니다으로
  • 버튼이 ActionListener를 사용해야합니다, 당신이 읽을 사람들이 코드를 읽기 위해 쉽게 것 다른 사람
+0

'MyMouseListener'에는'a'가 없습니다. –

+0

처음에 가져 오기 행을 사용하여 이와 같은 코드를 만들 때 컴파일 할 때 "심볼을 찾을 수 없습니다."라는 오류가 하나 있습니다. 이것은 코드의 끝 부분에있는'objLabel1.setText (Integer.toString (a));'줄에 있습니다. – randomguy537

+0

@ElliottFrisch 'MyMouseListener'는 정적 인 내부 클래스가 아니고, 인스턴스 내부 클래스이고,'option1'의'a'와 ' – MadProgrammer