我正在学习Java程序。我非常陌生,我慢慢地掌握它。
我的代码非常基本;我使用动作监听器来读取输入JTextField的文本,但是我的代码给了我一个错误,上面写着" CreditGraphics.java:32:error:非静态变量这个不能被引用来自静态背景 text.addActionListener(this)",我在论坛上找不到很多有用的解决方案,至少没有适合我编码风格的解决方案。为什么它会给我这个错误,所以我可以避免它以供将来参考?
另外,我喜欢你们想给我的任何组织提示。
我正在尝试创建一个图形应用程序,它可以通过JTextField接收信用卡应用程序,然后通过我已经制作的程序运行它来检查卡的有效性。
谢谢!
这是我的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//if card is entered incorrectly reset textfield by doing textfield.setText("");
public class CreditGraphics implements ActionListener{
public static String cardNum;
public static JFrame frame;
public static JPanel panel;
public static JLabel label;
public static JTextField text;
public static void main(String[] args){
frame = new JFrame("HI");
panel = new JPanel();
label = new JLabel("Welcome to MES Banking!");
text = new JTextField();
panel.add(label);
panel.add(text);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setPreferredSize(new Dimension(500,500));
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
text.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
cardNum = text.getText();
}
}
答案 0 :(得分:5)
主要问题:
this
表示类,不是static
,它不能是因为它是主类。因此无法从静态上下文访问它,这是main
方法。
不要在main
方法中编写所有代码。你会遇到很多这个问题。在构造函数或init方法中执行ui构造。然后在main
其他要点:
在事件发送线程(EDT)上运行您的swing应用程序。详情请见Initial Threads。(另请参见下文)。
就个人而言,我不会让类实现ActionListener。我想要一个按钮的监听器实例。 (见下文)
<强>更新强>
这是一个带有上述点的重构
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class CreditGraphics {
public String cardNum;
public JFrame frame;
public JPanel panel;
public JLabel label;
public JTextField text;
public CreditGraphics() {
frame = new JFrame("HI");
panel = new JPanel();
label = new JLabel("Welcome to MES Banking!");
text = new JTextField();
panel.add(label);
panel.add(text);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setPreferredSize(new Dimension(500, 500));
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
text.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardNum = text.getText();
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new CreditGraphics();
}
});
}
}