Java basic GUI程序错误
在我的在线Java类中,我需要编写一个程序,计算一帧内鼠标单击按钮的次数。这是我的密码:Java basic GUI程序错误,java,user-interface,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 stat
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行,这是“找不到符号”
那么,我到底做错了什么?我希望响应者能准确地告诉我需要做什么来解决问题,并避免使用技术术语,因为我对编程相当陌生。我看到两个问题,即您的内部类应该是
静态的(要在没有option1
实例的情况下使用它,它可能应该是option1
,以符合Java命名约定),并且需要定义和初始化a
public static class MyMouseListener extends MouseAdapter {
int a = 0; //<-- add this.
public void mouseClicked(MouseEvent me) {
a++;
}
}
然后你可以通过a
像
MyMouseListener mml = new MyMouseListener();
objButton1.addMouseListener(mml);
System.out.println(mml.a);
最后,您最初的“”+a
方法将是“0”
,通常,只要可能,就从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
,因为鼠标不是触发按钮的唯一方式
- 您可能希望有一个通读版本,这将使人们更容易阅读您的代码,您也更容易阅读其他代码
我只是想让你的代码工作。但是关于标准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();
}
}
我想你最好先看看Java语言的基础知识,然后特别是这个和这个,我尝试了那个,使内部类是静态的,并将“int a=0”移到内部类下面。但是现在我在编译时遇到了一个不同的错误:“String s1=”“+a;”我得到一个错误“找不到符号”.@RANDOMGY537已编辑。显然,a
是侦听器的一部分;您应该阅读变量范围。MyMouseListener
没有a
。当这样编写代码时(导入行在开头),我在编译时仍然有一(1)个“找不到符号”错误。它在objLabel1.setText行中(整数.toString(a))
在代码末尾。@ElliottFrisch它不需要它,MyMouseListener
不是一个静态的内部类,它是一个实例内部类,可以使用选项1中的a
以及label@randomguy537请参见我如何创建objLable1
和实例字段,而不是在co中删除它构造函数作为局部变量…为什么要在标签的每个PropertyChange事件上调用addNotify?您应该需要调用addNotify…当然,没有必要。谢谢@MadProgrammer