Java基本GUI程序错误

时间:2014-12-21 01:54:01

标签: java user-interface

在我的在线Java课程中,我需要编写一个程序来计算框架内按钮上的鼠标点击次数。这是我的代码:

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行有一个错误,即#34;非静态变量,这不能从静态上下文引用#34;而另一个错误是在第36行,这是"找不到符号"。

那么,我究竟做错了什么?我希望响应者能够准确地告诉我需要做些什么来解决问题,并避免使用技术术语,因为我对编程很新。

3 个答案:

答案 0 :(得分:1)

我看到两个问题,即你的内部类应该是static(使用它而不是option1的实例,它应该是Option1以符合Java命名约定)而你需要定义和初始化a。像

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

此外,我建议您考虑使用更现代的JFrame而不是旧的Frame

修改

您需要保存对MouseListener的引用

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

然后你可以得到a喜欢的

System.out.println(mml.a);

最后,"" + a的原始方法是"0"

答案 1 :(得分:1)

通常,尽可能快地将main方法退出到非静态上下文中......

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。
  • 按钮应使用ActionListener,因为鼠标不是触发按钮的唯一方式
  • 您可能希望阅读Code Conventions for the Java TM Programming Language,这样可以让人们更轻松地阅读您的代码并让您阅读其他人

答案 2 :(得分: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();
   }
}