Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';我的代码怎么了?_Java_Swing_Actionlistener - Fatal编程技术网

Java 什么';我的代码怎么了?

Java 什么';我的代码怎么了?,java,swing,actionlistener,Java,Swing,Actionlistener,此代码也正在编译和执行,但方法actionPerformed()未正确执行。我的意思是,单击OK按钮后,JTextField中没有写入任何内容。即使在使用e.getSource()之后,也不会执行任何操作。System.out.println(“我完成了”)工作正常,但是t.setText(“你好”)不工作。?代码有什么问题??如果有人可以,请帮助我。 另外,您能详细说明一下,如果不在面板上添加JButton和JTextField,为什么它不可见?为什么添加面板以使按钮和文本字段可见很重要。没有

此代码也正在编译和执行,但方法
actionPerformed()
未正确执行。我的意思是,单击OK按钮后,
JTextField
中没有写入任何内容。即使在使用
e.getSource()
之后,也不会执行任何操作。
System.out.println(“我完成了”)
工作正常,但是
t.setText(“你好”)
不工作。?代码有什么问题??如果有人可以,请帮助我。
另外,您能详细说明一下,如果不在
面板上添加
JButton
JTextField
,为什么它不可见?为什么添加面板以使按钮和文本字段可见很重要。没有它就看不见为什么

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");  
    }
}

通过在构造函数中重新声明
b
变量,可以隐藏该变量,这意味着类中的
b
字段与GUI中显示的字段不同。不要这样做,你的问题就解决了

i、 例如,您正在这样做:

class A {
   JButton b; // this guy stays null!

   public A() {
       JButton b = new JButton(...);
   }
解决方案是这样做:

class A {
   JButton b;

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


为什么添加面板以使按钮和文本字段在swing中可见很重要


这是布局管理器的问题。默认情况下,JPanel使用FlowLayout,这将允许您添加组件,例如从左上角在书架中填写书籍。另一方面,JFrame的contentPane使用BorderLayout,如果在默认情况下向其添加内容,则只有最后添加的内容才会显示并填充GUI。请注意,您正在尝试设置边界(…)
,不应该这样做。让布局管理器来做这件事。

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

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

大概是这样的:

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

而不是执行您正在执行的操作,为什么不使用匿名内部类

比如:

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");
    }
}
我没有执行这段代码,但我确信这会起作用,这种方法将帮助您更好地组织代码。 这就是我通常编写代码的方式

如果您使用的是Java8,那么最好使用lambda表达式,因为
ActionListener
是一个单一的抽象方法接口

如果你想看看它的用途,那么它就是这样的:

b.addActionListener(e -> t.setText("Hello! World."));
为了更好的理解,你可以看看这个视频。它适用于JavaFX,但匿名内部类和lambda表达式的概念保持不变


“你也可以……”关于SO的问题应该是一个单一的、具体的问题。其他问题最好从单独的线程开始。另外:使用缩进代码行和代码块的逻辑和一致形式。缩进的目的是使代码的流程更易于遵循!另外请注意,您的问题标题对我们没有帮助,因为它非常缺乏信息。“我的代码出了什么问题”没有告诉我们你的问题,除了你有问题——但我们已经知道了,否则你就不会在这里了。在未来,请用更好的标题提出更好的问题。这对您和我们都有帮助。
f.setVisible(true)
应该是最后一个,在
pack()之后。
p.setBounds(0,0,300,300)Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或者与布局填充和边框一起使用。非常感谢:)各位。。(Y) 为什么添加面板以使按钮和文本字段在swing中可见很重要?