当前位置: 首页 > 知识库问答 >
问题:

正在尝试创建一个JTable,它从JTextField添加数据

姜俊友
2023-03-14

我正在尝试编写代码,将一行添加到JTable。我打字,但什么也没显示。我的showMessageDialog也有一个错误。

有人知道我怎么重写代码吗?

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;

import static javax.swing.JOptionPane.showMessageDialog;

public class JTABEL extends Component {
private JPanel panel1;
private JLabel Name;
private JLabel Age;
private JLabel Class;
private JTextField enterNameTextField;
private JTextField Agefield;
private JTextField EnterClassField;
private JTable Table;
private JButton saveButton;

public JTABEL() {
    saveButton.addActionListener(this::actionPerformed);
}

public static void main(String[] args) {
        JFrame frame = new JFrame("Jtable");
        frame.setContentPane(new JTABEL().panel1);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

private void actionPerformed(ActionEvent e) {
    if (enterNameTextField.getText().equals("") || Agefield.getText().equals("") || 
EnterClassField.getText().equals("")) {
        showMessageDialog(this, "please Enter all Data");
    } else {
        String data[] = {enterNameTextField.getText(), Agefield.getText(), 
EnterClassField.getText()};

        DefaultTableModel tableModel = (DefaultTableModel) Table.getModel();
        tableModel.addRow(new Object[]{enterNameTextField.getText(), Agefield.getText(), 
EnterClassField.getText()});
        showMessageDialog(this, "Add Data Successfully");
        enterNameTextField.setText("");
        Agefield.setText("");
        EnterClassField.setText("");
    }
}
} 

共有1个答案

韩禄
2023-03-14

Oracle提供了一个有用的教程,用Swing创建GUI。跳过NetBeans IDE部分的学习步骤。

我创建了以下GUI。

在添加了几个学生之后,这里是相同的GUI。

模型-视图-控制器(MVC)模式在创建Swing应用程序时非常有用。该名称意味着首先创建模型,然后创建视图,然后创建控制器。

应用程序模型由一个或多个普通Javagetter/setter类组成。

Swing视图是一个带有一个或多个jpanel的JFrame。该视图显示模型的内容。视图不会修改模型。

每个SwingActionListener都是一个控制器。控制器更新模型。

我创建了两个模型类。Student类包含姓名、年龄和班级。

JTableModel类为JTable保存DefaultTableModel

所有的Swing应用程序都必须以调用Swing公用事业调用程序方法开始。此方法确保在事件调度线程上创建和执行所有Swing组件。

我创建了一个JFrame和两个jpanel。一个JPanel保存JTable,另一个JPanel保存add student表单。JFrame有一个默认的BorderLayout。我把桌子JPanel放在中间,表格JPanel放在东边。

JPanel使用BorderLayoutJTable放在JScrollPane的内部。JScrollPane放在中间的表JPanel中。

表单JPanel使用GridBagLayout创建表单结构JPanel

所有Swing布局管理器的完整解释可以在Oracle教程中找到。

匿名JButtonActionListener检查字段是否已键入。如果是这样,将创建一个Student实例并将其传递给应用程序模型。如果没有,则会弹出错误显示。

下面是完整的可运行代码。我将附加的类设置为内部类,以便将代码作为一个块发布。

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class JTableExample implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JTableExample());
    }
    
    private final JTableModel model;
    
    private JFrame frame;
    
    private JTextField nameField, ageField, classField;
    
    public JTableExample() {
        this.model = new JTableModel();
    }

    @Override
    public void run() {
        frame = new JFrame("JTable Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        frame.add(createTablePanel(), BorderLayout.CENTER);
        frame.add(createAddPanel(), BorderLayout.EAST);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    private JPanel createTablePanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        JTable table = new JTable(model.getTableModel());
        JScrollPane scrollPane = new JScrollPane(table);
        
        panel.add(scrollPane, BorderLayout.CENTER);
        
        return panel;
    }
    
    private JPanel createAddPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(0, 5, 5, 5);
        gbc.gridwidth = 1;
        gbc.gridx = 0;
        gbc.gridy = 0;
        
        JLabel label = new JLabel("Name:");
        panel.add(label, gbc);
        
        gbc.gridx++;
        nameField = new JTextField(20);
        panel.add(nameField, gbc);
        
        gbc.gridx = 0;
        gbc.gridy++;
        label = new JLabel("Age:");
        panel.add(label, gbc);
        
        gbc.gridx++;
        ageField = new JTextField(20);
        panel.add(ageField, gbc);
        
        gbc.gridx = 0;
        gbc.gridy++;
        label = new JLabel("Class:");
        panel.add(label, gbc);
        
        gbc.gridx++;
        classField = new JTextField(20);
        panel.add(classField, gbc);
        
        gbc.gridwidth = 2;
        gbc.gridx = 0;
        gbc.gridy++;
        JButton button = new JButton("Add Student");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                String name = nameField.getText().trim();
                String ageString = ageField.getText().trim();
                String level = classField.getText().trim();
                
                if (name.isEmpty() || ageString.isEmpty() || level.isEmpty()) {
                    JOptionPane.showMessageDialog(
                            frame, "Please enter all information");
                    return;
                }
                
                int age = getAge(ageString);
                if (age > 0) {
                    model.addStudent(new Student(name, age, level));
                    clearInputFields();
                }
            }

            private int getAge(String ageString) {
                int age = -1;
                try {
                    age = Integer.valueOf(ageString);
                } catch (NumberFormatException e) {
                    JOptionPane.showMessageDialog(
                            frame, "Please enter a numeric age");
                }
                return age;
            }

            private void clearInputFields() {
                nameField.setText("");
                ageField.setText("");
                classField.setText("");
                
                nameField.requestFocus();
            }
        });
        
        panel.add(button, gbc);
        frame.getRootPane().setDefaultButton(button);
        
        return panel;
    }
    
    public class JTableModel {
        
        private final DefaultTableModel tableModel;
        
        public JTableModel() {
            this.tableModel = new DefaultTableModel();
            tableModel.addColumn("Name");
            tableModel.addColumn("Age");
            tableModel.addColumn("Class");
        }
        
        public void addStudent(Student student) {
            Object[] rowData = new Object[3];
            rowData[0] = student.getName();
            rowData[1] = student.getAge();
            rowData[2] = student.getLevel();
            tableModel.addRow(rowData);
        }

        public DefaultTableModel getTableModel() {
            return tableModel;
        }
        
    }
    
    public class Student {
        
        private final int age;
        
        private final String level, name;

        public Student(String name, int age, String level) {
            this.name = name;
            this.age = age;
            this.level = level;
        }

        public int getAge() {
            return age;
        }

        public String getLevel() {
            return level;
        }

        public String getName() {
            return name;
        }
        
    }

}

 类似资料:
  • 然后,该函数将使用API将一个json对象发送到数据库中,但似乎Volley.new请求队列(this);是一个空值。java.lang.NullPointerExcture:尝试在com.example.kevin.barcodescanner.addToCart.jsonParse的空对象引用上调用虚拟方法com.android.volley.请求com.android.volley.请求ue

  • 我使用Android Studios 1.5 我正在尝试做一些非常简单的事情:在我的项目中添加一个大的图像,作为我主要活动的背景。当我右键单击res时- 我做错了什么?我读过好几页,没有其他人有过这个问题。

  • 每当用户在JOptionPane确认对话框的帮助下被询问是否将产品添加到购物车时选择“是”,我都会尝试将行添加到我的表中。我的代码如下: 然而,我得到了这个错误:线程“AWT-EventQueue-0”java.lang.ClassCastException:javax.swing中出现异常。JTable$1无法强制转换为javax.swing.table.DefaultTableModel 有人

  • 我试图使用DefaultTableModel动态地向JTable添加数据,但是它不起作用。 我创建了两个类:一个类(Input.java)代表一个弹出窗口,允许你写数据(名称,选项和约束)并保存。另一个类表示一个弹出窗口,其中包含一个表(InputMain.java)。然后,InputMain会将这些信息(如果收到的话)转换为表格中的一行,在三列中列出所有这些信息。在Input中,我创建了Inpu

  • 你好,我尝试在ant中创建一个构建,如果它创建一个html报告,它将从eclips启动我的.class文件 “ “ 生成失败D:\Automation\Eclipse\MyWork\OpenCart\BUILD.xml:23:编译失败;有关详细信息,请参阅编译器错误输出。 总时间:1秒 ${lib}包含用于创建该类的所有库,并且只运行该类可以100%工作,但是当我试图在eclips中作为ant构建

  • 我有一个表,我用phpMyadmin数据库表中的数据填充,但我只希望根据我在文本字段中写入的id有一行。正如你在代码中看到的,我试着这么做,但我得到了一个-java。sql。SQLSyntaxErrorException:您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以了解在第1行中使用接近“from inputs where id='11'”的正确语法;有什么建议或解决方案