好吧,我正在尝试为计算器创建一个界面。此时,我有一个按钮,一个问候标签和一个标签,它将成为计算器的主线。当我运行代码时,窗口打开并显示问候语,但按钮无处可见。终端显示:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot use this in a static context
at Components.Interface.buttons(Interface.java:45)
at Components.Interface.main(Interface.java:60)
问题是,即使第45行和第60行没有代码,java仍会为这些行抛出异常。它为什么这样做?代码如下:
package Components;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class Interface {
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame frame;
JPanel text = new JPanel();
JPanel controlPanel = new JPanel();
JLabel digits = new JLabel("");
frame = new JFrame("Calculator");
frame.setLayout(new FlowLayout());
frame.setPreferredSize(new Dimension(300, 400));
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent) {
System.exit(0);
}
});
frame.add(text);
frame.add(controlPanel);
frame.setVisible(true);
frame.pack();
//about where line 45 is
digits.setBorder(BorderFactory.createLineBorder(Color.black));
digits.setSize(new Dimension(30, 20));
text.add(digits);
JLabel greet = new JLabel("Welcome to Calculator!");
greet.setSize(30, 20);
greet.setVerticalAlignment(SwingConstants.TOP);
greet.setBorder(BorderFactory.createLineBorder(Color.black));
text.add(greet);
//about where line 60 is
JButton one = new JButton("1");
one.setSize(100, 30);
one.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
digits.setText("1");
}
});
controlPanel.add(one);
}
}
答案 0 :(得分:3)
你现在最大的错误就是你正试图运行不可编辑的代码 - 永远不要这样做!而是找出编译器告诉你的问题,而不是JVM,然后尝试修复它们。只有在编译没有错误的情况下才尝试运行代码。
然后,编译器会警告您,您正在尝试在匿名内部类中使用非最终本地变量数字,这是不允许的。解决方案是将数字声明为最终变量。
final JLabel digits = new JLabel ("");
你可能会问为什么存在这个奇怪的要求,内部类是真正的类,甚至是匿名的内部类(比如你的ActionListener),当Java创建一个时,它会生成内部类使用的局部变量的副本,并传递这些副本进入内部阶级。如果变量不是最终变量,则副本可能与原始变量不同步。