我的代码出了什么问题?

时间:2015-06-21 19:02:59

标签: java swing actionlistener

此代码也在编译和执行,但方法actionPerformed()未正确执行。我的意思是在点击OK按钮后,JTextField中没有任何内容。使用e.getSource()后即不执行任何操作。 System.out.println("I am done ")工作正常,但t.setText("Hey there")无效。代码有什么问题?如果有人可以,请帮帮我 你也可以详细说明为什么如果不在JButton上添加JTextFieldPanel,它就不可见了?为什么添加面板以使按钮和文本字段可见是很重要的。没有它是不明显的原因?

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

class A implements ActionListener {

    JFrame f;
    JButton b;
    JPanel p;
    JLabel l;
    JTextField t;

    A(String s) {
        JFrame f=new JFrame(s);
        f.setVisible(true);
        f.setSize(400,400);
        JButton b= new JButton("OK");
        JTextField t=new JTextField();
        JPanel p=new JPanel(); 
        f.add(p);
        p.setBounds(0,0,300,300);
        p.add(b);
        b.setBounds(30,40,80,80);
        p.add(t);
        t.setBounds(100,200,80,80);
        b.addActionListener(this);
        t.addActionListener(this);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == b) {    
            t.setText("Hey There");
        }
        System.out.println("I m done!!");
    }

    public static void main(String[] args) {
         System.out.println("Hey there");  
         new A("First App");  
    }
}

3 个答案:

答案 0 :(得分:3)

您通过在构造函数中重新声明b变量来隐藏b变量,这意味着类中的class A { JButton b; // this guy stays null! public A() { JButton b = new JButton(...); } 字段与GUI中显示的字段不同。不要这样做,你的问题就解决了。

即你正在这样做:

class A {
   JButton b;

   public A() {
       b = new JButton(...); //note the difference?
   }

解决方案是这样做:

setBounds(...)

你问:

  

为什么添加面板以使按钮和文本字段在摇摆中可见是很重要的?

这是布局管理员的问题。默认情况下,JPanel使用FlowLayout,允许您添加组件,例如从左上角填写书架中的书籍。另一方面,JFrame的contentPane使用BorderLayout,如果您默认添加内容,则只显示最后添加的内容并填充GUI。请注意,您正在尝试@Entity public class User{ private String name; private String login; private String password; @OneToMany private List<Role> roles; } ,而您不应该这样做。让布局经理做那件事。

答案 1 :(得分:3)

您正在隐藏构造函数中的所有字段。

删除重新声明,它将按预期工作。

这样的事情:

A(String s) {
    f = new JFrame(s);
    f.setVisible(true);
    f.setSize(400, 400);
    b = new JButton("OK");
    t = new JTextField();
    p = new JPanel();
    f.add(p);
    p.setBounds(0, 0, 300, 300);
    p.add(b);
    b.setBounds(30, 40, 80, 80);
    p.add(t);
    t.setBounds(100, 200, 80, 80);
    b.addActionListener(this);
    t.addActionListener(this);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

请注意,我们不会重新声明任何这些变量。这就是你的活动没有解雇的原因;声明的字段仍为null

答案 2 :(得分:3)

而不是做你正在做的事情,为什么不使用匿名的内部类?

类似的东西:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class A {
    JFrame f;
    JButton b;
    JPanel p;
    JLabel l;
    JTextField t;

    A(String s) {
        f = new JFrame(s);
        f.setVisible(true);
        f.setSize(400, 400);

        p = new JPanel();
        p.setBounds(0, 0, 300, 300);

        t = new JTextField();
        t.setBounds(100, 200, 80, 80);
        p.add(t);

        b = new JButton("OK");
        b.setBounds(30, 40, 80, 80);
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                t.setText("Hello! World.");
            }
        });
        p.add(b);
        f.add(p);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        System.out.println("Hey there");
        new A("First App");
    }
}

我没有执行此代码,但我相信这会有用,这种方法可以帮助您更好地组织代码。 这就是我通常编码的方式。

如果您使用的是Java 8,则最好使用lambda表达式,因为ActionListener是单个抽象方法接口。

如果你想查看使用情况,那就是这样:

b.addActionListener(e -> t.setText("Hello! World."));

为了更好地理解,您可以查看此视频。它适用于JavaFX,但匿名内部类和lambda表达式的概念保持不变。

anonymous inner classes and lambda expressions