fcdslfa 2020-04-05 02:56 采纳率: 0%
浏览 346

java gui jdialog界面无法显示,以及jtable无法刷新

用java gui写了一个小项目出现两个小问题。
1.在点击添加按钮添加信息后jdialog无法自动刷新jtable的数据,但是数据库显示已经添加成功。
2.点击修改按钮后无法出现修改界面jdialog,但是点击添加按钮并操作后,修改界面可以显示。
addempinfo界面

package mhl.view;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import mhl.model.EmpModel;

public class addEmpInfo extends JDialog implements ActionListener{
    //添加组件
    JPanel jp1, jp2,jp3;
    JButton jb1,jb2;
    JLabel jl1, jl2, jl3, jl4, jl5, jl6;
    JTextField jtf1, jtf2, jtf3, jtf4, jtf5,jtf6;

    public addEmpInfo(EmpInfo empInfo, String title, boolean model) {
        //super(owner, title, modal);
        //上
        jl1 = new JLabel("学号");
        jl2 = new JLabel("姓名");
        jl3 = new JLabel("性别");
        jl4 = new JLabel("年龄");

        jtf1 = new JTextField();
        jtf2 = new JTextField();
        jtf3 = new JTextField();
        jtf4 = new JTextField();

        jb1 = new JButton("添加");
        jb1.addActionListener(this);
        jb2 = new JButton("取消");
        jb2.addActionListener(this);

        jp1 = new JPanel();
        jp2 = new JPanel();
        jp3 = new JPanel();

        jp1.setLayout(new GridLayout(4,1));
        jp2.setLayout(new GridLayout(4,1));

        jp1.add(jl1);
        jp1.add(jl2);
        jp1.add(jl3);
        jp1.add(jl4);

        jp2.add(jtf1);
        jp2.add(jtf2);
        jp2.add(jtf3);
        jp2.add(jtf4);

        jp3.add(jb1);
        jp3.add(jb2);

        this.add(jp1,BorderLayout.WEST);
        this.add(jp2,BorderLayout.CENTER);
        this.add(jp3,BorderLayout.SOUTH);


        this.setSize(400,300);
        //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if(e.getSource() == jb1) {
            EmpModel em = new EmpModel();
            String sql = "insert into rszl(empid,empname,sex,zw) values(?,?,?,?)";
            String paras[] = {jtf1.getText(), jtf2.getText(), jtf3.getText(), jtf4.getText()};
            if(!em.UpdateModel(sql, paras)) {
                //提示
                JOptionPane.showMessageDialog(this, "添加失败");
            }
            this.dispose();
        }else if(e.getSource() == jb2) {
            this.dispose();
        }
    }


}

empinfo界面

package mhl.view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

import mhl.model.EmpModel;

public class EmpInfo extends JPanel implements ActionListener{
    JTable jtable;
    JScrollPane jsp;
    JPanel p1, p2, p3, p4, p5;
    JLabel p1_lab1, p3_lab1;
    JTextField p1_jtf1;
    JButton p1_jb1, p4_jb1, p4_jb2, p4_jb3, p4_jb4;
    EmpModel em = null;

    public EmpInfo() {
        //上
        p1 = new JPanel(new FlowLayout(FlowLayout.CENTER));
        p1_lab1 = new JLabel("请输入姓名(员工号或职位)");
        p1_jtf1 = new JTextField(20);
        p1_jb1 = new JButton("查询");
        p1_jb1.addActionListener(this);
        p1.add(p1_lab1);
        p1.add(p1_jtf1);
        p1.add(p1_jb1);

        //中
        EmpModel em = new EmpModel();
        String paras[] = {"1"};
        em.query("select empid,empname,sex,zw from rszl where 1 = ?", paras);
        p2 = new JPanel(new BorderLayout());
        jtable = new JTable(em);
        jsp = new JScrollPane(jtable);
        p2.add(jsp);


        //下
        p3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        p3_lab1 = new JLabel("总记录是**条");
        p3.add(p3_lab1);

        p4 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        p4_jb1 = new JButton("详细信息");
        p4_jb1.addActionListener(this);

        p4_jb2 = new JButton("添加");
        p4_jb2.addActionListener(this);

        p4_jb3 = new JButton("修改");
        p4_jb3.addActionListener(this);

        p4_jb4 = new JButton("删除");
        p4_jb4.addActionListener(this);

        p4.add(p4_jb1);
        p4.add(p4_jb2);
        p4.add(p4_jb3);
        p4.add(p4_jb4);

        p5 = new JPanel(new BorderLayout());
        p5.add(p3,"West");

        p5.add(p4,"East");

        //设置整个布局为border
        this.setLayout(new BorderLayout());
        this.add(p1,"North");
        this.add(p2,"Center");
        this.add(p5,"South");
        this.setVisible(true);
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if(e.getSource() == p1_jb1) {
            System.out.println("用户希望查询");
            //查询
            String name = this.p1_jtf1.getText();
            String sql = "select empid,empname,sex,zw from rszl where empname = ?";
            String paras[] = {name};
            em = new EmpModel();
            em.query(sql, paras);
            jtable.setModel(em);

        }else if(e.getSource() == p4_jb1) {

        }else if(e.getSource() == p4_jb2) {

            addEmpInfo aei = new addEmpInfo(this,"sd",true);

            //构建新的数据模型类,并更新
            String sql = "select empid,empname,sex,zw from rszl where 1 = ?";
            String paras[] = {"1"};
            em = new EmpModel();
            em.query(sql, paras);
            jtable.setModel(em);

        }else if(e.getSource() == p4_jb3) {
            //用户希望修改
            int rowNum = this.jtable.getSelectedRow();
            if(rowNum == -1) {
                JOptionPane.showMessageDialog(this, "请选择一行");
                return;
            }
            System.out.println(rowNum);
            //显示修改对话框
            new UpdEmpInfo(this, "修改", true, em, rowNum);




        }else if(e.getSource() == p4_jb4) {
            int RowNum = this.jtable.getSelectedRow();
            if(this.jtable.getSelectedRow() == -1) {
                JOptionPane.showMessageDialog(this, "请选择一行");
                return;
            }

            String empid = (String)this.jtable.getValueAt(RowNum, 0);
            System.out.println("Id = " + empid);

            String sql = "delete from rszl where empid = ?";
            String paras[] = {empid};
            em = new EmpModel();
            em.UpdateModel(sql, paras);

            em = new EmpModel();
            String paras2[] = {"1"};
            em.query("select empid,empname,sex,zw from rszl where 1 = ?", paras2);
            jtable.setModel(em);
        }
    }
}

updempinfo界面

package mhl.view;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

import mhl.model.EmpModel;

/**
 * 修改
 * @author wang
 *
 */
public class UpdEmpInfo extends JDialog implements ActionListener{
    //添加组件
        JPanel jp1, jp2,jp3;
        JButton jb1,jb2;
        JLabel jl1, jl2, jl3, jl4, jl5, jl6;
        JTextField jtf1, jtf2, jtf3, jtf4, jtf5,jtf6;
        EmpModel em = null;
        public UpdEmpInfo(EmpInfo empInfo, String title, boolean model, EmpModel em, int rowNum) {
            //super();

            //上
            jl1 = new JLabel("学号");
            jl2 = new JLabel("姓名");
            jl3 = new JLabel("性别");
            jl4 = new JLabel("年龄");

            jtf1 = new JTextField();
            //初始化
            jtf1.setText(em.getValueAt(rowNum, 0).toString());
            jtf1.setEditable(false);

            jtf2 = new JTextField();
            jtf2.setText( em.getValueAt(rowNum, 1).toString());

            jtf3 = new JTextField();
            jtf3.setText(em.getValueAt(rowNum, 2).toString());

            jtf4 = new JTextField();
            jtf4.setText(em.getValueAt(rowNum, 3).toString());

            jb1 = new JButton("修改");
            jb1.addActionListener(this);
            jb2 = new JButton("取消");
            jb2.addActionListener(this);

            jp1 = new JPanel();
            jp2 = new JPanel();
            jp3 = new JPanel();

            jp1.setLayout(new GridLayout(4,1));
            jp2.setLayout(new GridLayout(4,1));

            jp1.add(jl1);
            jp1.add(jl2);
            jp1.add(jl3);
            jp1.add(jl4);

            jp2.add(jtf1);
            jp2.add(jtf2);
            jp2.add(jtf3);
            jp2.add(jtf4);

            jp3.add(jb1);
            jp3.add(jb2);

            this.add(jp1,BorderLayout.WEST);
            this.add(jp2,BorderLayout.CENTER);
            this.add(jp3,BorderLayout.SOUTH);



            this.setSize(400,300);
            //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setVisible(true);
        }


        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub

        }


}

model层

package mhl.model;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;

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

import mhl.db.SqlHelper;

/**
 * 这是人事的数据模型,完成对人事表的各种操作
 * @author wang
 *
 */
public class EmpModel extends AbstractTableModel{
    Vector<String> colums;
    Vector<Vector> rows;



    public boolean UpdateModel(String sql,String paras[])
    {
        SqlHelper hp=new SqlHelper();
        return hp.updateExecete(sql,paras);
    }

    //写一个方法,用于查询需要显示的人事信息
    public void query(String sql, String paras[]) {
        //初始化列
        this.colums = new Vector<String>();
        this.rows = new Vector<Vector>();

        //创建一个sqlhelper
        SqlHelper sh = new SqlHelper();
        ResultSet rs = sh.query(sql, paras);

        try {

            //从rs对象中可以得到resultsetmetdata
            //rsmt可以得到结果有多少个,且可以知道每列的名字
            ResultSetMetaData rsmt = rs.getMetaData();
            for(int i = 0; i < rsmt.getColumnCount(); i++) {
                this.colums.add(rsmt.getColumnName(i+1));
            }
            //把re结果放入rows
            while(rs.next()) {
                Vector<String> temp = new Vector<String>();
                for(int i = 0; i < rsmt.getColumnCount(); i++) {
                    temp.add(rs.getString(i+1));
                }
                rows.add(temp);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            sh.Close();
        }
    }

    @Override
    public int getRowCount() {
        // TODO Auto-generated method stub
        return this.rows.size();
    }

    @Override
    public int getColumnCount() {
        // TODO Auto-generated method stub
        return this.colums.size();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        // TODO Auto-generated method stub
        return ((Vector)rows.get(rowIndex)).get(columnIndex);
    }

    @Override
    public String getColumnName(int column) {
        // TODO Auto-generated method stub
        return this.colums.get(column).toString();
    }

}

  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-03-15 01:44
    关注

    针对你的问题,我有以下几点建议:

    1.关于 JDialog 不刷新 JTable 的问题,你需要在添加数据后手动更新 JTable 的数据模型,在 addEmpInfo 中的 jb1 的事件处理方法中添加如下代码:

    //更新数据模型并刷新 JTable
    em.query("select empid,empname,sex,zw from rszl where 1 = ?", new String[] {"1"});
    jtable.setModel(em);
    fireTableDataChanged();
    

    其中,em 是你的 EmpModel 对象,jtable 是在 EmpInfo 中声明的 JTable,这里需要使用 setModel 方法设置数据模型,再调用 fireTableDataChanged 方法通知 JTable 数据已更新。

    2.关于修改界面无法显示的问题,可能是因为在 UpdEmpInfo 的构造方法中没有给 em 赋值,导致在 actionPerformed 中使用 em 时出现了空指针异常。你可以在 UpdEmpInfo 的构造方法中添加如下代码:

    this.em = em;
    

    这样就给 em 赋上了值,在 actionPerformed 中就不会出现空指针异常了。

    希望以上建议对你有所帮助,如还有问题请及时询问。

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘