Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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 我不知道';我不明白为什么我的ActionListener在按下JButton时不工作?_Java_Swing_Jbutton_Actionlistener - Fatal编程技术网

Java 我不知道';我不明白为什么我的ActionListener在按下JButton时不工作?

Java 我不知道';我不明白为什么我的ActionListener在按下JButton时不工作?,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,我使用action listener,然后将其调用到一个传递函数的类。我不想在类中使用实现ActionListener,因为处理多个按钮更复杂。您能否从ActionListener访问方法 我也得到了一个可序列化的警告。我不知道那是什么意思。我抑制了警告,并在网上查找,但是,我仍然不理解它的上下文。第一个GUI项目,非常感谢您的帮助 import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt

我使用action listener,然后将其调用到一个传递函数的类。我不想在类中使用
实现ActionListener
,因为处理多个按钮更复杂。您能否从
ActionListener
访问方法

我也得到了一个可序列化的警告。我不知道那是什么意思。我抑制了警告,并在网上查找,但是,我仍然不理解它的上下文。第一个GUI项目,非常感谢您的帮助

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class GUI extends JFrame{
    public JFrame j;
    public JPanel p;
    public JButton NEW;
    public JButton update;
    public DefaultTableModel model;
    public JTable jt;

    public GUI(){
        setVisible(true);
        setSize(600,400);
        setTitle("Student Record Management System");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel p = new JPanel();
        JButton NEW = new JButton("Additional Student");
        NEW.setBounds(10,10,20,20);
        NEW.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                NEWpressed();
            }
        });
        p.add(NEW);
        JButton update = new JButton("Update Exam Scores");
        update.setBounds(50,40,20,20);
        update.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                updatepressed();
            }
        });
        p.add(update);
        String [] col = {"Last Name", "First Name", "HKID", "Student ID", "Final Exam Score"};
        String [][] data = {{"Rollins", "Zachary", "1234", "4321", "88"},{"Preston","John", "4321", "1234", "94"}};
        DefaultTableModel model = new DefaultTableModel(data, col);
        JTable jt = new JTable(model);
        jt.setEnabled(false);
        jt.setPreferredScrollableViewportSize(new Dimension(400,300));
        jt.setFillsViewportHeight(true);
        jt.setBackground(Color.BLUE);
        jt.setAlignmentY(BOTTOM_ALIGNMENT);
        JScrollPane jps = new JScrollPane(jt);
        p.add(jps);
        add(p);
    }
    public void NEWpressed(){
        model.addRow(new Object[]{"col 1", "col 2", "col 3", "col 4", "col 5"});
    }
    public void updatepressed(){
        jt.setEnabled(true);
        p.add(jt);
        add(p);
    }
    public static void main(String args []){
        GUI a = new GUI();
        a.setVisible(true);

    }

}

是的,您可以从onclicklistener调用方法,但问题在于您调用的方法

model.addRow()


在尚未定义的DefaultTableModel上。在调用按下的方法之前初始化“model”变量。

您的主要问题是隐藏了变量

您可以将
model
定义为实例变量

public DefaultTableModel model;
public JTable jt;
public JPanel p;
但在构造函数中定义了一个同名的局部变量

DefaultTableModel model = new DefaultTableModel(data, col);
JPanel p = new JPanel();
//...
JTable jt = new JTable(model);
这意味着当调用
NEWpressed
时,
model
null

您还将
p
jt
定义为实例变量

public DefaultTableModel model;
public JTable jt;
public JPanel p;
但是在构造函数中,您定义了一个同名的局部变量

DefaultTableModel model = new DefaultTableModel(data, col);
JPanel p = new JPanel();
//...
JTable jt = new JTable(model);
这意味着当按下
updatepressed
jt
p
null

丢失本地定义并在构造函数中实例化实例变量

public GUI() {
    p = new JPanel();
    //...
    model = new DefaultTableModel(data, col);
    //...
    jt = new JTable(model);

你能解释一下你的代码有什么问题吗。你有例外吗?如果是,请张贴堆栈跟踪。
NEW.setBounds(10,10,20,20)1)请学习类、方法和属性名称的通用(特别是用于名称的大小写)并一致使用它们。。。。2) javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。要为健壮的GUI组织组件,请改为使用布局管理器,或者与布局填充和边框一起使用。