学习Swing和Jframe以及其他东西 - 也想要一些关于组织的提示和技巧

时间:2014-07-27 02:45:59

标签: java swing jframe jtextfield

我正在学习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();
   }


}

1 个答案:

答案 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();
            }
        });
    }
}