defaulttablemodel 刷新数据库里的数据

如下图,我页面上有一个刷新按钮,想通过那个按钮在按钮监听事件中,获取result值然后直接刷新列表。现在按钮点了没反应,不知道哪里出了问题图片说明

 import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowSorter;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

import org.springframework.jdbc.core.RowCallbackHandler;

import com.tlxx.dao.MaterialDao;
import com.tlxx.model.MaterialList;
import com.tlxx.util.DbUtil;
import com.tlxx.util.StringUtil;

public class MaterialsFrm extends javax.swing.JInternalFrame {
    MaterialDao materialDao = new MaterialDao();
    DbUtil dbUtil = new DbUtil();
    private JTable Table;
    String[] COLUMN = { "物料编号", "物料名称", "规格", "包装规格", "产地", "计量单位", "库存", "单价" };// 表格的列
    private Object[][] result;
    private DefaultTableModel model;// 声明定义表格的模型
    private JTextField ItmNameTxt;
    private JTextField ItmIdTxt;

    /**
     * Create the frame.
     */
    public MaterialsFrm() {
        setClosable(true);
        setIconifiable(true);
        setFrameIcon(null);
        this.setLocation(0, 0);
        setTitle("\u836F\u6750\u5217\u8868");

        initComponents();
        getContentPane().setLayout(null);

    }

    // 搜索框检索查询
    private void searchActionPerformed(ActionEvent evt) {
        String itmName = this.ItmNameTxt.getText();
        String itmId = this.ItmIdTxt.getText();
        if (StringUtil.isEmpty(itmName) && StringUtil.isEmpty(itmId)) {
            JOptionPane.showMessageDialog(null,
                    "<html> <font face= '宋体 ' size= '5'> <b>物料名称或编号不能为空!</b> </font> </html> ");
            return;
        }
        MaterialList matlist = new MaterialList(itmId, itmName);
        try {
            result = getFileStates(materialDao.search(dbUtil.getCon(), matlist));
            if (result.length == 0) {
                JOptionPane.showMessageDialog(null,
                        "<html> <font face= '宋体 ' size= '5'> <b>不存在该物料,请重新输入!</b> </font> </html>");
            }
        } catch (Exception e) {
            e.printStackTrace();
            JOptionPane.showConfirmDialog(null,
                    "<html> <font face= '宋体 ' size= '5'> <b>查询异常,请重试或联系管理员!</b> </font> </html>");
        }
    }

    // 刷新物料按钮
    private void refreshActionPerformed(ActionEvent evt) {
        try {
            result = getFileStates(materialDao.selectMaterial(dbUtil.getCon()));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        model = new DefaultTableModel(result, COLUMN);
        Table = new JTable();
        Table.setModel(model);

    }

    private void initComponents() {
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(30, 150, 1300, 538);
        getContentPane().add(scrollPane);

        Table = new JTable();
        scrollPane.setColumnHeaderView(Table);

        try {
            result = getFileStates(materialDao.selectMaterial(dbUtil.getCon()));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        JButton searchButton = new JButton("搜索");
        searchButton.setBounds(610, 27, 123, 33);
        getContentPane().add(searchButton);
        searchButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                searchActionPerformed(evt);
            }
        });

        JLabel label_ItemName = new JLabel("物料名称");
        label_ItemName.setFont(new Font("宋体", Font.PLAIN, 20));
        label_ItemName.setBounds(30, 31, 81, 33);
        getContentPane().add(label_ItemName);

        ItmNameTxt = new JTextField();
        ItmNameTxt.setBounds(140, 28, 96, 33);
        getContentPane().add(ItmNameTxt);
        ItmNameTxt.setColumns(10);

        JLabel label_ItmID = new JLabel("物料编号");
        label_ItmID.setFont(new Font("宋体", Font.PLAIN, 20));
        label_ItmID.setBounds(297, 31, 81, 33);
        getContentPane().add(label_ItmID);

        ItmIdTxt = new JTextField();
        ItmIdTxt.setBounds(406, 28, 96, 33);
        getContentPane().add(ItmIdTxt);
        ItmIdTxt.setColumns(10);

        JButton refreshButton = new JButton("刷新物料");
        refreshButton.setBounds(30, 106, 123, 29);
        getContentPane().add(refreshButton);
        refreshButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                refreshActionPerformed(evt);
            }
        });
        // 数字字段需要按照数值类型排序,而不是字符串类型排序。需覆盖DefaultTableModel的getColumnClass方法进行数值排序
        model = new DefaultTableModel(result, COLUMN) {
            public Class getColumnClass(int column) {
                Class returnValue;
                if ((column >= 0) && (column < getColumnCount())) {
                    returnValue = getValueAt(0, column).getClass();
                } else {
                    returnValue = Object.class;
                }
                return returnValue;
            }
        };
        Table = new JTable() {
            //表格不允许被编辑
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
        Table.setModel(model);
        // RowSorter方法进行表格内排序
        RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        Table.setRowSorter(sorter);

        // Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // 设置表格大小改变自动变化模型
        Table.setGridColor(Color.black);// 设置表格中网格线颜色
        Table.setFont(new Font("宋体", Font.BOLD, 20));// 设置字体
        DefaultTableCellRenderer cr = new DefaultTableCellRenderer();// 设置单元格居中显示
        cr.setHorizontalAlignment(SwingConstants.CENTER);
        Table.setDefaultRenderer(Object.class, cr);

        JTableHeader tableHeader = Table.getTableHeader();
        tableHeader.setReorderingAllowed(false);// 设置表格列不可移动
        scrollPane.setViewportView(Table);
        pack();
    }

    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame.setDefaultLookAndFeelDecorated(true);
                JDialog.setDefaultLookAndFeelDecorated(true);
                try {
                    /*
                     * 更改皮肤,点击substance.jar -> 找到org.jvnet.substance.skin这个包 ->
                     * 将下面的SubstanceDustCoffeeLookAndFeel 替换成
                     * 刚刚打开的包下的任意一个“Substance....LookAndFeel”即可
                     */
                    UIManager.setLookAndFeel(new org.jvnet.substance.skin.SubstanceCremeCoffeeLookAndFeel());
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                new MaterialsFrm().setVisible(true);
            }
        });
    }

    private Object[][] getFileStates(List list) { // 获取二维数组的方法
        Object[][] types = new Object[list.size()][8];
        for (int i = 0; i < list.size(); i++) {
            MaterialList type = (MaterialList) list.get(i);
            types[i][0] = type.getItmID();
            types[i][1] = type.getItmName();
            types[i][2] = type.getItmSpec();
            types[i][3] = type.getPackSpec();
            types[i][4] = type.getPlace();
            types[i][5] = type.getPrice();
            types[i][6] = type.getStock();
            types[i][7] = type.getUnit();
        }
        return types;
    }
}

1个回答

f12打开浏览器调试模式,看有没有报错。

qq_20946905
qq_20946905 我这个是用java swing做的客户端,不是web serice
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
通过JAVA按钮事件更新数据库内数据,同时动态的刷新窗口内显示的数据
public class Buy extends JPanel implements ActionListener { Connection conn; Statement stmt; ResultSet rs; String DBDRIVER ="com.microsoft.sqlserver.jdbc.SQLServerDriver"; String dbURL = "jdbc:sqlserver://localhost:1433;DatabaseName=高铁动车售票系统"; String userName = "sa"; String userPwd = "123456"; private JSplitPane jsp1 =new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); private JPanel jp2 =new JPanel(); private JButton jb2 =new JButton("确定"); private JLabel jl3 =new JLabel("请输入要买的车票编号:"); private JTextField jtxt3 =new JTextField(); public void connDB() { //连接数据库方法 try { conn=DriverManager.getConnection(dbURL,userName,userPwd); stmt=conn.createStatement(); }catch(Exception e) { e.printStackTrace(); System.out.println("连接失败!"); } } public void closeDB() { //关闭数据库方法 try { rs.close(); stmt.close(); conn.close(); }catch(Exception e) { e.printStackTrace(); } } public boolean searchticketno(String str) { boolean x=false; this.connDB(); try { rs=stmt.executeQuery("select * from 车票信息表"); while(rs.next()) { if(rs.getString("车票编号").trim().equals(str)) { //在java中,判断字符串是否相同,一定要使用equals函数!!!!!!!! x=true; } } }catch(Exception e) { e.printStackTrace(); } return x; } Vector<String> head =new Vector<String>(); { head.add("车票编号"); head.add("车次"); head.add("座位等级"); head.add("票价"); head.add("座位号"); head.add("出发站"); head.add("目的站"); head.add("出发时间"); head.add("到站时间"); head.add("余票数量"); } DataBase db= new DataBase(); Vector row =db.getdata(); DefaultTableModel dtm =new DefaultTableModel(row,head); JTable jt =new JTable(dtm); JScrollPane jspn =new JScrollPane(jt); public Buy() { this.setLayout(new GridLayout(1,1)); jsp1.setTopComponent(jp2); jsp1.setBottomComponent(jspn); jsp1.setDividerLocation(80); jsp1.setDividerSize(4); jp2.setLayout(null); jb2.setBounds(400,30,60,20); jp2.add(jb2); jb2.addActionListener(this); jl3.setBounds(60, 30, 160, 20); jp2.add(jl3); jtxt3.setBounds(200, 30, 100, 20); jp2.add(jtxt3); this.add(jsp1); this.setBounds(10, 10, 800, 600); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jb2) { //判定文本框内容,车票信息改变,余票数量-1,乘客购票成功 if(!searchticketno(jtxt3.getText().trim())) { JOptionPane.showMessageDialog(null,"对不起,车票编号不存在!请重新输入!"); jtxt3.setText(""); } else { //未实现的功能 } } } } ``` public class DataBase { private final static String URL = "jdbc:sqlserver://localhost:1433; DatabaseName=高铁动车售票系统"; private static final String USER="sa"; private static final String PASSWORD="123456"; private Vector<Object> row =new Vector() ; private Vector rowsdata =new Vector(); private static Connection conn=null; //静态代码块(将加载驱动、连接数据库放入静态块中) static{ try { //1.加载驱动程序 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //2.获得数据库的连接 conn=(Connection)DriverManager.getConnection(URL,USER,PASSWORD); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } //对外提供一个方法来获取数据库连接 public static Connection getConnection(){ return conn; } //测试用例 // public static void main(String[] args) throws Exception // { // // //3.通过数据库的连接操作数据库,实现增删改查 // Statement stmt = conn.createStatement(); // //ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句 ,返回一个结果集(ResultSet)对象。 // ResultSet rs = stmt.executeQuery("select 车票编号,车次,座位等第,票价,座位号,出发站,目的站,出发时间,到站时间,余票数量 from 车票信息表"); // while(rs.next()){//如果对象中有数据,就会循环打印出来 // System.out.println(rs.getString("车票编号")+","+rs.getString("车次")+","+rs.getString("座位等第")+","+rs.getString("票价")+","+rs.getString("座位号")+","+rs.getString("出发站")+","+rs.getString("目的站")+","+rs.getString("出发时间")+","+rs.getString("到站时间")+","+rs.getString("余票数量")); // } // } public Vector getdata() { try{ //3.通过数据库的连接操作数据库,实现增删改查 Statement stmt = conn.createStatement(); //ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句 ,返回一个结果集(ResultSet)对象。 ResultSet rs = stmt.executeQuery("select * from 车票信息表"); while(rs.next()){//如果对象中有数据,就会循环打印出来 row.add(rs.getString("车票编号")); row.add(rs.getString("车次")); row.add(rs.getString("座位等第")); row.add(rs.getString("票价")); row.add(rs.getString("座位号")); row.add(rs.getString("出发站")); row.add(rs.getString("目的站")); row.add(rs.getString("出发时间")); row.add(rs.getString("到站时间")); row.add(rs.getString("余票数量")); rowsdata.add(row); row=new Vector(); }}catch(SQLException e) { e.printStackTrace(); return null; } return rowsdata; } } ``` ![图片说明](https://img-ask.csdn.net/upload/201906/25/1561473164_888693.png) ``` 希望最后的结果就是在文本框内输入车票编号,然后检索数据库,有对应车票编码的车票就显示购票成功,同时刷新当前显示的数据表,更新余票数量。 ```
DefaultTableModel表格问题
Java如何往DefaultTableModel表格中添加一行具有不同类型的数据 例如一行数据中有String类型,也有JButton类型
为什么java显示数据库连接成功但是却显示不出表
代码如下 //连接数据库且显示 Vector rowData,columnNames; columnNames = new Vector(); rowData = new Vector(); columnNames.add("学号"); columnNames.add("学生姓名"); columnNames.add("性别"); columnNames.add("出生日期"); columnNames.add("班级"); columnNames.add("学院"); columnNames.add("年级"); try { connect_sql consql = new connect_sql();//创建对象 Connection conn = consql.getConnection();//链接数据库 try { Statement sta = conn.createStatement();//创建sql语句的接口 ResultSet result = sta.executeQuery("select*from student");//result接受语句选中student表 ResultSetMetaData metaData = result.getMetaData();//接受result中的元数据 while(result.next()) { Vector hang = new Vector(); int id = result.getInt(1); String name = result.getString(2); String sex = result.getString(3); String brithday = result.getString(4); String className = result.getString(5); String insititute = result.getString(6); int grade = result.getInt(7); hang.add(id);hang.add(name);hang.add(sex);hang.add(brithday); hang.add(className);hang.add(insititute);hang.add(grade); rowData.add(hang); } } catch(Exception e) { e.printStackTrace(); conn.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } DefaultTableModel model = new DefaultTableModel(rowData,columnNames); JTable jTable = new JTable(model);//创建表格组件 jTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); jsp.add(jTable); } }
java 中用defaulttablemodel 给JTable制作表头
大家好,本人小白一名,在看书的时候遇到了操作不出效果的,想请教一下大家伙: 我想给JTable添加表头,用到了DefaultTableModel。 教材的例子是这样来实现的(其他部分省略了): ``` tabletest = new JTable(); //定义列名 String[]names={"星期一","星期二","星期三","星期四","星期五","星期六","星期七"}; DefaultTableModel model = new DfaultTableModel(names,15); tabletest.setModel(model); ``` 我发现运行出来的效果是没有表头的,也没有任何的错误信息,如下: ![图片说明](https://img-ask.csdn.net/upload/201702/16/1487227385_42066.jpg) 当我去翻了DefaualtTableModel的[中文文档[](http://www.apihome.cn/api/java/DefaultTableModel.html "")](http://www.apihome.cn/api/java/DefaultTableModel.html "")后,发现,这种写法,是获取names的数量作为列的数量,没有设置表头。 于是我换用DefaultTableModel(内容,表头)的方式,如下: ``` tabletest = new JTable(); //定义列名 String[]names={"星期一","星期二","星期三","星期四","星期五","星期六","星期七"}; String[][]content=new String[15][7]; DefaultTableModel model = new DfaultTableModel(content,names); tabletest.setModel(model); ``` 最后运行的效果图和之前的是一样的,均没有表头。 但是,在eclipse上,JTable控件的model属性中,是这样的: ![图片说明](https://img-ask.csdn.net/upload/201702/16/1487228223_340690.jpg) 想请教一个各位大大,这种运行结果没表头,也没报错,是我哪儿没有设置对,让表头显示出来么? 十分谢谢~ 希望能找到这种显示的原因~
想将数据库的数据调入容器中但显示空指针。所以想问下该怎么解决
public class Wenben extends JFrame implements TableModelListener{ JTable table; Vector<Vector>hang; Vector lie;//fang 4ge Vector h1; //数据调用 public void dy(){ lie.add("ID"); lie.add("name"); lie.add("time"); lie.add("money"); String url = "jdbc:odbc:uaccess";// 根据数据源,设置数据库URL String userName = "sh";// 登录数据库用户名 String password = "sh";// 用户密码 Connection conn = null;// 声明Connection对象 Statement stmt = null;// 声明Statement对象 try { // 加载JDBC-ODBC驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 创建连接 conn = DriverManager.getConnection(url);//("jdbc:odbc:driver={microsoft access driver (*.mdb)};dbq=d:/user/2011级计算机系学生信息.mdb"); // 通过Connection对象,创建Statement对象 stmt = conn.createStatement(); // 执行查询"年龄为20岁的学生信息"的SQL语句,得到结果集 ResultSet rs = stmt.executeQuery("select * from 员工信息表 "); // 通过循环输出相关学生信息 /* System.out.println("学号" + "\t\t姓名" + "\t性别" + "\t出生日期"+ "\t年龄" + "\t专业方向" + "\t\t\t宿舍"); */ while (rs.next()) { String id = rs.getString("ID"); String name = rs.getString("姓名"); String time = rs.getString("时间"); int money=rs.getInt("金钱"); h1.add(id); h1.add(name); h1.add(time); h1.add(money); hang.add(h1); System.out.println(id + "\t" + name + "\t" + time + "\t" + money + "\t"); } rs.close(); // 关闭结果集 stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } } //数据调用结束 public Wenben(){ super("JTable测试"); TableModel model=new DefaultTableModel(hang,lie); model.addTableModelListener(this); table=new JTable(model); table.setFillsViewportHeight(true); table.setAutoCreateRowSorter(true); getContentPane().add(new JScrollPane(table), BorderLayout.CENTER); /*setSize(300, 200);setVisible(true);validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);*/ } public void tableChanged(TableModelEvent e){ } public static void main(String args[]){ Wenben wb=new Wenben(); wb.dy(); } }
myeclipse的jtable为何获取不到数据库的内容
package main; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Connection; import java.sql.DriverManager; import java.util.Vector; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class DisplayPerson extends javax.swing.JFrame { /** Creates new form display */ public DisplayPerson() { createTableModel(); } private void createTableModel() { JTable JTableView = new JTable(); jScrollPane1 = new javax.swing.JScrollPane(); DefaultTableModel JTableModel = new DefaultTableModel(200,2); JTableModel.addColumn("PersonId"); JTableModel.addColumn("age"); JTableView.setModel(JTableModel); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); JTableView.setModel(new javax.swing.table.DefaultTableModel( new Object[][] { }, new String[] { "PersonId", "age"})); jScrollPane1.setViewportView(JTableView); javax.swing.GroupLayout layout = new javax.swing.GroupLayout( getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup(layout.createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING).addGroup( layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(13, Short.MAX_VALUE))); layout.setVerticalGroup(layout.createParallelGroup( javax.swing.GroupLayout.Alignment.LEADING).addGroup( layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); pack(); String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; //加载JDBC驱动 String dbURL = "jdbc:sqlserver://127.0.0.1:1433; DatabaseName=student"; String userName = "root"; String userPwd = "123"; Connection dbConn; try { Class.forName(driverName); dbConn = DriverManager.getConnection(dbURL, userName, userPwd); System.out.println("Connection Successful!"); Statement st = dbConn.createStatement(); ResultSet rs = st.executeQuery("select * from Person"); while (rs.next()) { Vector<Integer> vcRows = new Vector<Integer>(); vcRows.addElement(rs.getInt(1)); vcRows.addElement(rs.getInt(2)); // JTableModel.addRow(rs.getInt(1)); //error // JTableModel.addRow(rs.getString(2)); //error JTableModel.addRow(vcRows); //添加一行记录到表格模板中 } //5.关闭连接 rs.close(); st.close(); dbConn.close(); // DBConnection.closeStmtAndCon(); //关闭相关连接 } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new DisplayPerson().setVisible(true); } }); } //GEN-BEGIN:variables // Variables declaration - do not modify private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable JTableView; // End of variables declaration//GEN-END:variables }
大神 看看这个程序连接access数据库为啥不成功啊 急!!!!
package 测试项目; import java.lang.*; import java.awt.*; import javax.swing.*; import javax.swing.table.*; import java.awt.event.*; import java.sql.Connection; import java.sql.*; public class Scores { public static void main(String [] args){ new ScoresWindow("成绩查询系统"); } } class ScoresWindow extends JFrame{ private static final long serialVersionUID = -6924196421756933199L; Statement statement; Connection connection; String commandString; ResultSet resultSet; JButton addJButton=new JButton("确认"); JTextField noJTextField=new JTextField(9); JTextField scoresJTextField=new JTextField(5); JPanel inputPanel=new JPanel(false); JButton queryJButton=new JButton("查询"); JTextField queryNOJTextField=new JTextField(9); JTextArea queryJTextArea=new JTextArea(); JPanel queryJPanel=new JPanel(false); JButton sortJButton=new JButton("排序"); Object clonameObject[]={"学号","成绩"}; Integer rows=0; DefaultTableModel tableModel=new DefaultTableModel(clonameObject,rows); JTable table=new JTable(tableModel); JPanel sortJPanel=new JPanel(false); Dimension dimension=new Dimension(100,25); public ScoresWindow(String titleString) { super(titleString); JTabbedPane jTabbedPane=new JTabbedPane(); JComponent inputPanel=inputJComponent(); JComponent queryPanel=queryJComponent(); JComponent sortPanel=sortJComponent(); jTabbedPane.addTab("输入成绩", inputPanel); jTabbedPane.addTab("查询成绩", queryPanel); jTabbedPane.addTab("成绩排序", sortPanel); setLayout(new GridLayout(1,1)); add(jTabbedPane); jTabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); setBounds(100, 100, 300, 400); setVisible(true); validate(); addJButton.addActionListener(new AddAction()); queryJButton.addActionListener(new QueryAction()); sortJButton.addActionListener(new SortAction()); getConnectDataBase(); setDefaultCloseOperation(EXIT_ON_CLOSE); } protected class AddAction implements ActionListener{ public void actionPerformed(ActionEvent e){ String noString; try { noString=noJTextField.getText(0, 9); commandString="INSERT INTO scores VALUES('"+noString+"','"+scoresJTextField.getText()+"')"; statement=connection.createStatement(); statement.execute(commandString); statement.closeOnCompletion(); alterJComponent(inputPanel, "添加成功!"); statement.closeOnCompletion(); } catch (Exception e2) { alterJComponent(inputPanel, "学号为9位!请重新输入!\n"+e2.toString()+""); } } } protected class QueryAction implements ActionListener{ public void actionPerformed(ActionEvent e){ try { statement=connection.createStatement(); String noString=queryNOJTextField.getText(0, 9); commandString="SELECT * FROM SCORES WHERE NUMBER='"+noString+"'"; resultSet=statement.executeQuery(commandString); resultSet.first(); queryJTextArea.append("您查询的学号为 "+resultSet.getString(1)+" 的成绩为 "+resultSet.getString(2)+"\n"); statement.closeOnCompletion(); } catch (Exception e2) { alterJComponent(queryJPanel, "学号为9位!请重新输入!\n"+e2.toString()+""); } } } protected class SortAction implements ActionListener{ public void actionPerformed(ActionEvent e){ commandString="SELECT * FROM scores ORDER BY score DESC"; try { statement=connection.createStatement(); resultSet=statement.executeQuery(commandString); if(tableModel.getRowCount()>0) { tableModel=(DefaultTableModel)table.getModel(); tableModel.setRowCount(rows*2); table.setModel(tableModel); table.repaint(); } while (resultSet.next()) { tableModel.addRow(new Object[]{resultSet.getString(1),resultSet.getString(2)}); } statement.closeOnCompletion(); }catch (Exception e2) { alterJComponent(sortJPanel, "错误!\n"+e2.toString()+""); } } } protected JComponent inputJComponent(){ Box studentLabelBox,studentFieldBox,baseBox; JLabel nolJLabel=new JLabel("学号"); JLabel scoresJLabel=new JLabel("成绩"); studentLabelBox=Box.createVerticalBox(); studentLabelBox.add(nolJLabel); studentLabelBox.add(Box.createVerticalGlue()); studentLabelBox.add(scoresJLabel); studentFieldBox=Box.createVerticalBox(); studentFieldBox.add(noJTextField); studentFieldBox.add(Box.createVerticalStrut(8)); studentFieldBox.add(scoresJTextField); baseBox=Box.createHorizontalBox(); baseBox.add(studentLabelBox); baseBox.add(studentFieldBox); JPanel boxJPanel=new JPanel(false); boxJPanel.setLayout(new FlowLayout()); boxJPanel.add(baseBox); boxJPanel.add(addJButton); noJTextField.setPreferredSize(dimension); scoresJTextField.setPreferredSize(dimension); inputPanel.setLayout(new BorderLayout()); inputPanel.add(boxJPanel,BorderLayout.CENTER); return inputPanel; } protected JComponent queryJComponent(){ JLabel noLabel=new JLabel("学号:"); queryNOJTextField.setPreferredSize(dimension); queryJTextArea.setEditable(false); queryJPanel.setLayout(new BorderLayout()); JPanel northPanel=new JPanel(false); northPanel.add(noLabel); northPanel.add(queryNOJTextField); northPanel.add(queryJButton); queryJTextArea.setAlignmentX(CENTER_ALIGNMENT); JScrollPane scrollPane=new JScrollPane(queryJTextArea); queryJPanel.add(scrollPane,BorderLayout.CENTER); queryJPanel.add(northPanel,BorderLayout.NORTH); return queryJPanel; } protected JComponent sortJComponent(){ sortJPanel.setLayout(new BorderLayout()); table.setEnabled(false); sortJPanel.add(new JScrollPane(table),BorderLayout.CENTER); JPanel sortButtonJPanel=new JPanel(false); sortButtonJPanel.setLayout(new FlowLayout()); sortButtonJPanel.add(sortJButton); sortJPanel.add(sortButtonJPanel,BorderLayout.NORTH); return sortJPanel; } protected JComponent alterJComponent(JComponent jComponent,String infosString){ JOptionPane jOptionPane=new JOptionPane(); JOptionPane.showMessageDialog(jComponent, infosString); return jOptionPane; } protected void getConnectDataBase(){ try { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); System.out.println("Acces驱动成功加载!"); //建立JDBC-ODBC桥接器 } catch (ClassNotFoundException e) { System.out.println(e); } Connection conn =DriverManager.getConnection("jdbc:odbc:MangoDatabase","",""); System.out.println("已成功连接到数据库!"); alterJComponent(inputPanel, "已成功连接到数据库!"); } catch (Exception e) { System.out.println(e); alterJComponent(inputPanel, "错误!\n"+e.toString()+""); } } }
Swing Jtble 排序后,表格数据无法刷新
(源代码文件Test.java在最后已附上) 操作描述: 1.添加 -> 刷新 2.点击表头进行排序 3.清空 -> 刷新 4.刷新按钮失效,会报错,如何解决?(如果不点击表头排序,则功能正常) Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 at java.util.Vector.elementAt(Vector.java:470) at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:649) at javax.swing.JTable.getValueAt(JTable.java:2720) at javax.swing.JTable.prepareRenderer(JTable.java:5718) at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2114) at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:2016) at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1812) at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161) at javax.swing.JComponent.paintComponent(JComponent.java:778) at javax.swing.JComponent.paint(JComponent.java:1054) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JViewport.paint(JViewport.java:731) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482) at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413) at javax.swing.RepaintManager.paint(RepaintManager.java:1206) ...... 整个测试代码文件如下: **Test.java** : package examples; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Vector; public class Test extends javax.swing.JFrame { private Vector<Vector> tblDate; // 表数据 private Vector<String> tblHeaders; // 表头 private List<Integer> list; // 数据源 public Test() { tblDate = new Vector<Vector>(); tblHeaders = new Vector<String>(); list = new ArrayList<Integer>(); tblHeaders.add("编号"); tblHeaders.add("数据"); initComponents(); setLocationRelativeTo(null); } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // 添加 list.add(list.size()); } private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { // 清空 list.clear(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // 刷新 tblDate.clear(); for (int i : list) { tblDate.add(new Vector(Arrays.asList(i, "测试数据" + i))); } jTable1.repaint(); jTable1.updateUI(); } // 下面都是NetBeans自动生成代码,不要管 public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (Exception ex) { // TODO } java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { new Test().setVisible(true); } }); } @SuppressWarnings("unchecked") private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jTable1.setModel(new javax.swing.table.DefaultTableModel( this.tblDate, this.tblHeaders )); jTable1.setAutoCreateRowSorter(true); jScrollPane1.setViewportView(jTable1); jButton2.setText("添加"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jButton3.setText("清空"); jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); jButton1.setText("刷新"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing .GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout .Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout .PREFERRED_SIZE, 0, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addGap(0, 168, Short.MAX_VALUE) .addComponent(jButton2) .addGap(18, 18, 18) .addComponent(jButton3) .addGap(18, 18, 18) .addComponent(jButton1))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 190, Short .MAX_VALUE) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout .Alignment.BASELINE) .addComponent(jButton1) .addComponent(jButton2) .addComponent(jButton3)) .addContainerGap()) ); pack(); } private javax.swing.JButton jButton1; private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable jTable1; }
如何监听DefaultTableModel?
我想要点击表头进行操作,但只能在table中进行,因为table可以监听,model不行
有没有大神能指点一下哪里错了。。。。
package Frame; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; import javax.swing.*; import db.DButil; public class login extends JFrame implements ActionListener{ private JPanel jp=new JPanel(); //创建标签数组 private JLabel[] jlArray={new JLabel("用户名"), new JLabel("密 码"),new JLabel("")}; private JButton jb1; private JButton jb2; private JButton jb3; private JTextField jtf=new JTextField(); private JPasswordField jpf=new JPasswordField(); //布局构造实现方法 public login(){ Icon icon1=new ImageIcon("login.jpg"); Icon icon2=new ImageIcon("reset.jpg"); Icon icon3=new ImageIcon("zhuce.jpg"); JPanel jp=new JPanel(){ protected void paintComponent(Graphics g) { ImageIcon icon = new ImageIcon("bg.jpg"); Image img = icon.getImage(); g.drawImage(img, 0, 0, icon.getIconWidth(), icon.getIconHeight(), icon.getImageObserver()); }}; jp.setLayout(null); jb1=new JButton(icon1); jb2=new JButton(icon3); jb3=new JButton(icon2); jlArray[0].setBounds(70,120,90,32); jb1.setBounds(365,110,130,60); jb2.setBounds(365,170,130,60); jlArray[1].setBounds(70,170,90,32); //将标签与按钮添加到JPanel容器中 jp.add(jlArray[0]); jp.add(jlArray[1]); jp.add(jb1); jp.add(jb2); jb1.addActionListener(this); jb2.addActionListener(this);//为按钮注册动作事件监听器 //添加修改密码的按钮 jb3.setBounds(365,230,130,60); jp.add(jb3); jp.add(jtf); jtf.setBounds(140,120,180,30);//设置文本框位置 jp.add(jpf); jpf.setBounds(140,170,180,30);//设置密码框位置 jpf.setEchoChar('*'); //密码显示字符形式 jpf.addActionListener(this); //为密码框注册动作事件监听器 this.setVisible(true);//设置窗体的可见性 jpf.addActionListener(this); //为密码框注册动作事件监听器 //设置用于显示登陆状态的标签大小位置,并将其添加进JPanel容器 jlArray[2].setBounds(70,220,300,30); jp.add(jlArray[2]); this.setTitle("登陆");//设置窗体标题 this.setBounds(450,200,500,318);//设置窗体的大小 this.setResizable(false);//设置窗体不让用户调整大小 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setVisible(true);//设置窗体的可见性 this.add(jp);//将窗体添加到面板中 jp.setBackground(Color.blue); } public static void main(String[] args) { new login();//创建登陆窗体 } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //得到用户名与密码 String user=jtf.getText().trim(); String pwd=String.valueOf(jpf.getPassword());//返回密码的字符串表示方式 String sql=""; if(e.getSource()==jtf){//事件源为文本框,切换焦点到密码框 jpf.requestFocus(); } else if(e.getSource()==jb1||e.getSource()==jpf){ //判断用户名和密码是否匹配 查询数据库 if(DButil.check(user, pwd)){ //登陆成功 MainFrame mf=new MainFrame(jtf.getText());//主窗体 this.dispose(); } else{ //登陆失败 jlArray[2].setText("对不起,非法的用户名和密码"); this.clear(); } } else if(e.getSource()==jb2) {//事件源为注册按钮 if(user.equals("")||pwd.equals("")) {//如果注册的用户名为空或者密码为空 jlArray[2].setText("用户名和密码都不得为空!!!"); this.clear();//清空输入文本框 } else { sql="select uid from user where uid='"+user+"'"; if(DButil.isExist(sql)) {//用户名已经存在 jlArray[2].setText("对不起,用户名已存在!!!"); this.clear();//清空输入文本框 } else { sql="insert into user values('"+user+"','"+pwd+"')"; if(DButil.update(sql)>0) {//注册成功 jlArray[2].setText("恭喜您!!!注册成功,请登陆"); } } } } else if(e.getSource()==jb3)//修改密码的监听 { //判断是否已经输入用户名和密码 if(user.equals("")||pwd.equals("")) { jlArray[2].setText("修改密码先输入正确的用户名和密码!!!"); this.clear();//清空输入文本框 } //判断是否输入了正确的用户名和密码 else if(DButil.check(user,pwd)) { //正确的用户名和密码 String password=JOptionPane.showInputDialog(this,"修改密码:","请输入新密码", JOptionPane.PLAIN_MESSAGE); //得到新的密码为空 if(password==null||password.equals("")) { JOptionPane.showMessageDialog(this,"密码不得为空!!!","错误", JOptionPane.WARNING_MESSAGE); } else {//密码不为空 sql="update user set pwd='"+password+"' where uid='"+user+"'";//更新密码的SQL if(DButil.update(sql)>0) {//密码修改成功 this.clear();//清空输入文本框 jlArray[2].setText("恭喜您!!!密码修改成功,请用新密码登陆"); } } } else { JOptionPane.showMessageDialog(this,"用户名或者密码错误!!!","错误", JOptionPane.WARNING_MESSAGE); this.clear();//清空输入文本框 } } } package Frame; import javax.swing.*; import javax.swing.table.DefaultTableModel; import db.DButil; import java.awt.*; import java.awt.event.*; import java.sql.*; import java.io.*; import java.util.*; public class MainFrame extends JFrame implements ActionListener,ItemListener { private String uname=null;//当前用户的名字 private boolean isInsert=false;//是否为添加默认为否 private JPanel topjp=new JPanel();//界面上半部分的JPanel容器 private JButton jba=new JButton("模糊查询"); private JButton jbs=new JButton("查找"); private JTextField jtfs=new JTextField();//按给出信息查找联系人信息 private JRadioButton jrbxm=new JRadioButton("按姓名查找",true); private JRadioButton jrbbh=new JRadioButton("按学号查找",false); private ButtonGroup bg=new ButtonGroup();//单选按钮组 private JPanel jpbr=new JPanel();//单选按钮面板 private JPanel jpyInfo=new JPanel();//右侧显示个人信息的面板 private JTextArea jta=new JTextArea(); // 模糊查询得到的信息文本区 private JLabel[] jlInfo={new JLabel("学号:"),new JLabel("姓名:"), new JLabel("性别:"),new JLabel("出生日期:"), new JLabel("电话号码:"),new JLabel("QQ:"), new JLabel("Email:"),new JLabel("地址:"), new JLabel("添加相片")}; private JButton[] jbInfo={new JButton("编辑"),new JButton("保存"), new JButton("浏览"), new JButton("上传"),}; private JLabel jlPhoto=new JLabel();//显示图像的JLabel控件 private JTextField[] jtfInfo=new JTextField[10]; private JTextField jtfPhoto=new JTextField();//添加照片到相册的路径 private JFileChooser jfcPic=new JFileChooser();//上传图像的文件选择器 private DefaultTableModel tableModel; private JTable table; //性别部分 private JRadioButton jrbMale=new JRadioButton("男",true); private JRadioButton jrbFemale=new JRadioButton("女"); private ButtonGroup bgGender=new ButtonGroup(); private JPanel jpGender=new JPanel();//单选按钮面板 private JLabel jlDetail=new JLabel();//右侧显示一幅图片的标签 private JSplitPane jspOuter=//上下分割的JSplitPane new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); //系统托盘部分 private PopupMenu popup=new PopupMenu(); private SystemTray tray;//定义SystemTray成员变量 private TrayIcon trayIcon;//定义TrayIcon成员变量 private MenuItem exit=new MenuItem("退出程序");//定义菜单 public void initJps() {//界面上半部分的初始化 topjp.setLayout(null);//设置topjp布局管理器为null //设置按钮大小并添加到JPanel面板里 jba.setBounds(5,10,120,26); jba.addActionListener(this);//为模糊查询按钮注册事件监听器 topjp.add(jba); jbs.setBounds(130,10,80,26); jbs.addActionListener(this);//为查找按钮注册事件监听器 topjp.add(jbs);//添加按钮到topjp面板里 //设置jtfs文本框大小并添加到jps面板里 jtfs.setBounds(215,10,120,26); jtfs.addActionListener(this);//为文本框注册事件监听器 topjp.add(jtfs); //设置单选按钮大小和位置并添加到jpbr面板里同时添加到bg单选按钮组里 jrbxm.setBounds(5,3,50,26); jrbxm.addItemListener(this);//为单选按钮注册ItemEvent事件监听器 bg.add(jrbxm); jpbr.add(jrbxm); jrbbh.setBounds(60,3,50,26); jrbbh.addItemListener(this); bg.add(jrbbh); jpbr.add(jrbbh); jpbr.setBounds(360,10,200,26); topjp.add(jpbr); } public void initInfo() {//初始化信息界面 jpyInfo.setLayout(null);//设置布局管理器为空 jpyInfo.setBounds(50,50,380,360);//设置信息面板的大小和位置 jlPhoto.setBounds(220,10,150,170);//设置联系人图像JLabel的大小和位置 jlPhoto.setBorder(BorderFactory.createLineBorder(Color.BLACK));//将JLbel的边框线显现出来 jpyInfo.add(jlPhoto);//将显示联系人照片的JLabel添加到信息面板 tableModel=new DefaultTableModel(); Vector vector1 = new Vector(); DButil db = new DButil(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); tableModel.setDataVector(null, vector1); System.out.print(123); table=new JTable(tableModel); //table.addMouseListener((MouseListener) this); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JScrollPane js=new JScrollPane(table); //添加相片部分的控件 jtfPhoto.setBounds(80,250,200,26);//设置得到照片路径的文本框的大小和位置 jpyInfo.add(jtfPhoto);//将得到照片路径的文本框添加到信息面板 jbInfo[2].setBounds(285,250,80,26); jbInfo[2].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[2]); //上传按钮 jbInfo[3].setBounds(380,250,80,26); jbInfo[3].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[3]); for(int i=0;i<9;i++)//添加JLabel,并设置大小和位置 { jlInfo[i].setBounds(20,10+i*30,60,26); jpyInfo.add(jlInfo[i]); } for(int i=0;i<10;i++) {//初始化一些文本框 jtfInfo[i]=new JTextField(); } //学号 jtfInfo[0].setBounds(80,10,135,26); jpyInfo.add(jtfInfo[0]); //姓名 jtfInfo[1].setBounds(80,40,135,26); jpyInfo.add(jtfInfo[1]); //出生日期 jtfInfo[3].setBounds(80,100,135,26); jpyInfo.add(jtfInfo[3]); //电话号码 jtfInfo[4].setBounds(80,130,135,26); jpyInfo.add(jtfInfo[4]); //QQ jtfInfo[5].setBounds(80,160,135,26); jpyInfo.add(jtfInfo[5]); //Email jtfInfo[6].setBounds(80,190,135,26); jpyInfo.add(jtfInfo[6]); //地址文本框的添加 jtfInfo[7].setBounds(80,220,285,26); jpyInfo.add(jtfInfo[7]); //模糊查询信息文本区的添加 js.setBounds(0,350,600,100); jpyInfo.add(js); //编辑、保存按钮 jbInfo[0].setBounds(160,300,80,26); jbInfo[0].addActionListener(this); jpyInfo.add(jbInfo[0]); jbInfo[1].setBounds(260,300,80,26); jbInfo[1].addActionListener(this); jpyInfo.add(jbInfo[1]); //性别部分 jrbMale.setBounds(5,3,50,26); jrbMale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbMale); jpGender.add(jrbMale); jrbFemale.setBounds(60,3,50,26); jrbFemale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbFemale); jpGender.add(jrbFemale); jpGender.setBounds(60,70,125,26); jpyInfo.add(jpGender); } public void clearInfo()//清空信息面板 { for(int i=0;i<10;i++) { jtfInfo[i].setText("");//清空文本框 } jlPhoto.setIcon(null);//清空图像 } public void setjtaArea(String information){ if(information.isEmpty()){ JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { jta.setText(information); } } public void setInfo(Vector<String> pInfo)//将信息向量设置到信息面板中 {//将信息向量按规则填到信息面板里 this.clearInfo(); if(pInfo.size()==0) { JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { for(int i=0;i<2;i++) {//显示联系人编号和姓名 jtfInfo[i].setText(pInfo.get(i)); } if(pInfo.get(2).equals("男")) {//显示性别 jrbMale.setSelected(true); } else {//显示性别 jrbFemale.setSelected(true); } for(int i=3;i<9;i++) {//显示出生日期、电话号码和QQ jtfInfo[i].setText(pInfo.get(i)); } } } public Vector<String> getInfo()//从信息面板得到用户输入的信息 { Vector<String> pInfo=new Vector<String>(); pInfo.add(jtfInfo[0].getText().trim());//添加pid pInfo.add(jtfInfo[1].getText().trim());//添加pname String gender=jrbMale.isSelected()?"男":"女"; pInfo.add(gender);//添加性别 pInfo.add(jtfInfo[3].getText().trim());//出生日期 pInfo.add(jtfInfo[4].getText().trim());//电话号码 pInfo.add(jtfInfo[5].getText().trim());//QQ pInfo.add(jtfInfo[6].getText().trim());//Email pInfo.add(jtfInfo[7].getText().trim());//地址 String photoPath=jtfPhoto.getText().trim();//得到照片路径 pInfo.add(photoPath);//照片路径 return pInfo; } public void monitorSaveButton() //监听保存按钮的方法 { String sql=""; String pid=jtfInfo[0].getText().trim();//得到联系人的编号 String pname=jtfInfo[1].getText().trim();//得到联系人的姓名 String gender=jrbMale.isSelected()?"男":"女"; String s1=jtfInfo[3].getText().trim(); String s2=jtfInfo[4].getText().trim(); String s3=jtfInfo[5].getText().trim(); String s4=jtfInfo[6].getText().trim(); String s5=jtfInfo[7].getText().trim(); String s6=jtfPhoto.getText().trim(); String sqla="select * from contacts where pid='"+pid+"'";//判断此编号是否存在的SQL String sqlb="select * from contacts where pname='"+pname+"'";//判断此姓名是否存在的SQL boolean isIdExist=DButil.isExist(sqla);//得到编号是否存在 boolean isNameExist=DButil.isExist(sqlb);//得到姓名是否存在 if(!(pid.equals(" ")||pname.equals(" "))) { if(isIdExist||isNameExist){ JOptionPane.showMessageDialog(this,"联系人已存在"+ " , 添加联系人失败","错误",JOptionPane.WARNING_MESSAGE); } else { sql="insert into contacts values (?,?,?,?,?,?,?,?,?,?)"; String[] paras={pid,pname,gender,s1,s2,s3,s4,s5,s6,null}; if(DButil.update(sql,paras)>0){ JOptionPane.showMessageDialog(this,"联系人保存成功","提示", JOptionPane.INFORMATION_MESSAGE); } } } } public void setEditable(boolean Editable)//设置信息窗口是否可编辑 { jrbFemale.setEnabled(Editable);//设置性别是否可编辑 jrbMale.setEnabled(Editable);//设置性别是否可编辑 for(int i=0;i<8;i++) { jtfInfo[i].setEditable(Editable);//设置文本框是否可编辑 } } public void monitorSearchButton()//监听查找按钮的方法 { String name=jtfs.getText().trim(); String sql="";//声明查找字符串 if(name.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else { if(jrbxm.isSelected()==true) {//按姓名查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pname='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } else {//按编号查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pid='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } } this.setEditable(false);//设置面板不可编辑 } public void monitorRandomSearchButton(String information){ //监听模糊查询按钮 String adress=jba.getText().trim(); String sql="";//声明查找字符串 if(adress.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else{ sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where padress like '%天河区%'"; } } public MainFrame(String uname) { //主窗体构造器 this.uname=uname;//设置用户名 this.initJps();//界面上半部分的搭建 this.initInfo(); jspOuter.setDividerLocation(46);//设置分割窗体JSplitPane的位置 jspOuter.setTopComponent(topjp);//设置窗体上半部分的控件 jspOuter.setBottomComponent(jpyInfo);//设置下半部分的控件 //设置窗体关闭按钮执行的动作 this.add(jspOuter); this.addWindowListener( new WindowAdapter() { @SuppressWarnings("deprecation") public void WindowClosing(WindowEvent e) { //将窗体隐藏 MainFrame.this.hide(); } } ); //设置主窗体的图标、标题、大小以及可见性 this.setResizable(false);//设置窗体不让调整大小 this.setTitle(uname+"的通讯录"); this.setBounds(420,80,618,550); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jbInfo[1]) {//保存按钮的监听 this.monitorSaveButton(); } else if(e.getSource()==jba) {//模糊查询按钮的监听 DButil db = new DButil(); Vector vector1 = new Vector(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); String ad = jtfs.getText().trim(); tableModel.setDataVector(db.getData(ad),vector1); } else if(e.getSource()==jbInfo[2]) {//打开图像文件路径 jfcPic.showOpenDialog(this); if(jfcPic.getSelectedFile()!=null) { jtfPhoto.setText(""+jfcPic.getSelectedFile()); } } else if(e.getSource()==jbInfo[0]) {//编辑按钮的监听 this.setEditable(true);//设置信息面板可编辑 } else if(e.getSource()==jbs||e.getSource()==jtfs) {//查找,按按钮或者在文本框里敲回车 this.monitorSearchButton(); } } public void itemStateChanged(ItemEvent e) { } public static void main(String[] args){ } } package db; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.Vector; public class DButil { private static String jdbcName="org.gjt.mm.mysql.Driver";//声明驱动类字符串 //声明数据库连接字符串 private static String dbUrl="jdbc:mysql://127.0.0.1:3306/maillist"; private static String dbUserName="root"; private static String dbPassword="admin"; private static Connection con=null;//声明数据库连接对象引用 private static Statement stat=null;//声明语句对象引用 private static PreparedStatement pstmt=null; private static ResultSet rs=null;//声明结果集对象引用 private static PreparedStatement psInsert=null;//声明预编译语句对象引用 public static Connection getConnection()//得到数据库连接的方法 { System.out.println("连接中.."); try { Class.forName(jdbcName);//加载驱动类 con=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);//得到连接 System.out.println("成功连接"); } catch(Exception e){e.printStackTrace();} return con;//返回连接 } public static boolean check(String user,String pwd)//登陆验证 { boolean flag=false; try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery("select pwd from user where uid='"+user+"'"); rs.next(); String spwd=rs.getString(1);//得到密码 if(spwd.equals(pwd)) { flag=true;//密码匹配,登陆成功 } } catch(Exception e) { flag=false;//有任何异常发生,登陆失败 } finally{DButil.closeCon();}//关闭数据库连接 return flag; } //某条记录是否存在 public static boolean isExist(String sql) { boolean flag=false;//设置返回值 try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 if(rs.next()) { flag=true;//存在,设置返回值为true } } catch(Exception e) { e.printStackTrace(); flag=false;//发生任何异常,置返回结果为false } finally{DButil.closeCon();}//关闭数据库连接 return flag;//返回结果 } public static int update(String sql,String[] paras)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); pstmt=con.prepareStatement(sql); for(int i=0; i<paras.length;i++){ pstmt.setString(i+1, paras[i]); } count=pstmt.executeUpdate(); } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } public static int update(String sql)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); stat=con.createStatement(); count=stat.executeUpdate(sql);//执行更新 } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } //====================添加联系人================================= public static String insertPerson(String uid,Vector<String> pInfo) { String isPathNull="isNotNull";//传过来的图像是不是合法,默认不为空 try{ con=getConnection();//得到数据库连接 if(pInfo.get(8).equals("")||pInfo.get(8)==null) {//照片路径为空,则不插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,uid)"+ "values(?,?,?,?,?,?,?,?,?)"); } else {//照片路径不为空,则插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,pphoto,uid)"+ "values(?,?,?,?,?,?,?,?,?,?,?)" ); File f=new File(pInfo.get(8));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(11,b);//设置pphoto参数的数据 } for(int i=0;i<8;i++) {//设置公共信息 psInsert.setString(i+1,pInfo.get(i)); } psInsert.setString(10,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//图片路径不对 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭数据库连接 return isPathNull; } public static String updatePerson(String uid,Vector<String> pInfo){ String isPathNull="isNotNull";//传过来的path是不是合法 try{ con=getConnection(); if(pInfo.get(9).equals("")||pInfo.get(9)==null) {//更新时候,如果照片路径为空,则不更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,birthday=?,pnumber=?,"+ "pQQ=?,pemail=?,padress=?,pphoto=?,uid=? where pid='"+pInfo.get(0).trim()+"'"); } else {//如果照片路径不为空,则更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,page=?,pnumber=?,"+ "pemail=?,pgroup=?,ppostalcode=?,padress=?,uid=?,pphoto=? where pid='"+pInfo.get(0).trim()+"'"); File f=new File(pInfo.get(9));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(10,b); } for(int i=1;i<8;i++){//设置公共的信息部分 psInsert.setString(i,pInfo.get(i)); } psInsert.setString(9,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//路径不合法 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭连接 return isPathNull; } public Vector getData(String ad){ Vector vector=new Vector(); try { //陈述对象 con=getConnection();//得到数据库连接 stat=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);//创建语句对象 rs=stat.executeQuery("select * from contacts where padress LIKE '%"+ad+"%'"); ResultSetMetaData rm=rs.getMetaData(); //循环打印出数据库表中数据 int n=rm.getColumnCount(); while(rs.next()){ Vector ve=new Vector(); for(int i=1;i<n+1;i++){ String s=rs.getString(i); ve.add(s); } vector.add(ve);//Vector对象接收表中数据 } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{if(rs!=null){ try { rs.close();//关闭结果集 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stat!=null){ try { stat.close();//关闭陈述对象 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null){ try { con.close();//关闭连接 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return vector; } public static Vector<String> getPerInfo(String sql)//得到联系人信息 { Vector<String> pInfo=new Vector<String>(); try { con=getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 while(rs.next()) { for(int i=1;i<10;i++) { System.out.println(rs.getString(i)); pInfo.add(rs.getString(i));//将联系人信息添加到返回向量 } } } catch(Exception e) { e.printStackTrace(); } finally{DButil.closeCon();}//关闭数据库连接 return pInfo;//返回信息集合 } public static void closeCon()//关闭数据库连接的方法 { try { if(rs!=null){rs.close(); rs=null;}//如果结果集不为空关闭结果集并赋值null if(stat!=null){stat.close(); stat=null;}//如果语句对象不为空关闭语句对象并赋值null if(con!=null){con.close(); con=null;}//如果连接不为空关闭连接并赋值null } catch(Exception e){e.printStackTrace();} } public static void main(String[] args){ DButil DB=new DButil(); System.out.println(DB.getConnection()); } } }
JTable中行自动滚动问题
程序从数据库取出五六十条数据,我想让表格滚动显示,为什么以下代码不可以实现呢,求大神指教 public void showTable(){ tableModel = new DefaultTableModel(tableValueV,tableColumnV); table = new MTable(tableModel,tableHeadSize); //设置行的高度 table.setRowHeight(tableRowSize); table.setEnabled(false); //在网上查到的方法,然而并没有用,为什么呢 int rowCount = table.getRowCount(); table.getSelectionModel().setSelectionInterval(rowCount-1, rowCount-1); Rectangle rect = table.getCellRect(rowCount-1, 0, true); table.repaint(); //若需要的话 table.updateUI();//若需要的话 table.scrollRectToVisible(rect); table.setBackground(Color.LIGHT_GRAY); scrollPane.setViewportView(table); }
Java GUI如何将文件中的内容读入Jtable中
文件中有四列信息,分别是不同的数据类型,想要用DefaulttableModel读进去,但是构造函数需要一个二维数组以及一个一维数组,二维数组那个地方由于只能定义一种类型,但是需要的数据有多种类型,不知道应该怎样解决了
Java 学生信息管理系统 求助 为什么会出现nullerror
nullError Exception in thread "main" java.lang.NullPointerException at Student.SQLFrame.getObject(SQLFrame.java:255) at Student.SQLFrame.setTable(SQLFrame.java:287) at Student.SQLFrame.init(SQLFrame.java:226) at Student.SQLFrame.<init>(SQLFrame.java:215) at Student.SQLFrame.main(SQLFrame.java:340) package Student; import java.awt.BorderLayout; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import Student.Student; import Student.SQLTool; public class SQLFrame extends JFrame implements ActionListener { private JTable mainTab;// 显示学生记录的table private JButton allBtn;// 显示所有学生记/录 private JButton addBtn;// 添加新的学生记录 private JButton findBtn;// 根据姓名查询学生记录 private JButton delBtn;// 根据学号删除学生记录 private SQLTool tool;// 数据库操作类实例 private String[] tableName = { "学号", "姓名", "性别", "成绩", "备注" }; private int width[] = { 70, 60, 50, 80, 50, 140 }; public SQLFrame() { this.setVisible(true); this.setTitle("SimpleSMS"); this.setSize(500, 570); this.setResizable(false);// 设置窗口大小固定 this.setLocationRelativeTo(null);// 设置窗口居中 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); this.init(); initLayout(); } private void init() {// 组件初始化方法 tool = new SQLTool(); ArrayList<Student> stuList = tool.selectAll(); mainTab = new JTable(); setTable(stuList); mainTab.getTableHeader().setReorderingAllowed(false);// 设置Table列不可拖动 mainTab.setEnabled(false);// 设置Table不可编辑 allBtn = new JButton("所有记录"); addBtn.addActionListener(this); addBtn = new JButton("添加记录"); addBtn.addActionListener(this); findBtn = new JButton("查询记录"); findBtn.addActionListener(this); delBtn = new JButton("删除记录"); delBtn.addActionListener(this); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void initLayout() { Panel btnPal = new Panel(); btnPal.add(allBtn); btnPal.add(addBtn); btnPal.add(findBtn); btnPal.add(delBtn); JScrollPane scroll = new JScrollPane(mainTab); add(scroll, BorderLayout.CENTER); add(btnPal, BorderLayout.SOUTH); } private Object[][] getObject(ArrayList<Student> stuList) { // 将stuList数组转变为Object的二维数组用于插入JTable Object[][] objects = new Object[stuList.size()][6]; for (int i = 0; i < stuList.size(); i++) { for (int j = 0; j < 6; j++) { switch (j) { case 0: objects[i][j] = stuList.get(i).getID(); break; case 1: objects[i][j] = stuList.get(i).getName(); break; case 2: objects[i][j] = stuList.get(i).getSex(); break; case 3: objects[i][j] = stuList.get(i).getClassStr(); break; case 4: objects[i][j] = stuList.get(i).getScore(); break; case 5: objects[i][j] = stuList.get(i).getRemarks(); break; default: break; } } } return objects; } private void setTable(ArrayList<Student> stuList) {// 更新Table数据 Object[][] objects = getObject(stuList); DefaultTableModel model = new DefaultTableModel(objects, tableName); mainTab.setModel(model); for (int i = 0; i < 6; i++) { mainTab.getColumnModel().getColumn(i).setPreferredWidth(width[i]); } } public void actionPerformed(ActionEvent e) { if (e.getSource().equals(allBtn)) { // 显示所有学生信息 setTable(tool.selectAll());// 查询所有学生信息,并在Table中显示出来 } else if (e.getSource().equals(addBtn)) { // 添加新的学生记录 InsertDialog insertDialog = new InsertDialog();// 自定义输入学生信息的对话框 // showInsertDialog方法显示对话框,并将输入的学生信息返回 Student stu = insertDialog.showInsertDialog(); if (stu != null) {// 判断是否有效 // 调用工具类的insert方法插入新的学生信息,并判断是否成功 if (tool.insert(stu)) { setTable(tool.selectAll()); } else { JOptionPane.showMessageDialog(null, "数据添加失败!"); } } } else if (e.getSource().equals(findBtn)) { // 通过姓名查询学生记录 // 弹出对话框让用户输入学生姓名 String nameStr = JOptionPane.showInputDialog("请输入查询学生的姓名:"); ArrayList<Student> stuList = tool.selectByName(nameStr); // 根据学生姓名查询学生记录,并将查询到的学生记录显示到Table中 setTable(stuList); } else { // 通过学号删除学生记录 try { // 若输入的不为纯数字将发生异常,通过显示错误提示解决异常 int id = Integer.parseInt(JOptionPane.showInputDialog("请输入删除学生的学号:")); // 调用工具类的deleteByID方法删除学生信息,并判断是否成功 if (tool.deleteByID(id)) { JOptionPane.showMessageDialog(null, id + "删除成功"); setTable(tool.selectAll()); } else { JOptionPane.showMessageDialog(null, "未找到学号:" + id); } } catch (Exception e2) { JOptionPane.showMessageDialog(null, "学号应为纯数字!"); } } } public static void main(String[] args){ SQLFrame frame = new SQLFrame(); frame.show(); } }
在swing的Jtable初始化中已经添加过数据,查询一条或者多条数据,Jtbale里数据不更新
import java.awt.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Vector; import java.awt.event.ActionEvent; //创建主窗口 public class mainFace { private JFrame mainframe; private JTextField chepaiField; private Vector cars; private SelectCar sc=new SelectCar() ; private JTable ResultTable; private JScrollPane scrollPaneForRusultTable ; private DefaultTableModel tableModel; private Vector<String> columnNames=new Vector<>(); public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { mainFace window = new mainFace(); window.mainframe.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the application. */ public mainFace() { initialize(); } /** * Initialize the contents of the frame. */ private void initialize() { mainframe = new JFrame(); mainframe.setTitle("阜建路段客车升降档查询系统"); mainframe.getContentPane().setLayout(null); JLabel chepauLable = new JLabel("请输入车牌"); chepauLable.setBounds(54, 32, 80, 15); mainframe.getContentPane().add(chepauLable); chepaiField = new JTextField(); chepaiField.setBounds(144, 29, 99, 21); mainframe.getContentPane().add(chepaiField); chepaiField.setColumns(10); //查询按钮 JButton selectButton = new JButton("查询"); selectButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(chepaiField.getText().length()<1) { /*chepaiField(车牌)输入长度小于1,表示未输入车牌,弹出对话框*/ JOptionPane.showMessageDialog(null, "查询所有车辆","未输入车牌",JOptionPane.ERROR_MESSAGE); //长度小于1,查询所有车牌 cars=null; cars=sc.selectAll(); } else { //长度不小于1,执行查询指定车牌的车 cars=null; cars=sc.selectCar(chepaiField.getText()); } ResultTable=null; ResultTable = new JTable(cars,columnNames); scrollPaneForRusultTable.setViewportView(ResultTable); } }); selectButton.setBounds(285, 28, 93, 23); mainframe.getContentPane().add(selectButton); System.out.println("1"); Vector<String> columnNames=new Vector<>(); columnNames.addElement("序号"); columnNames.addElement("车牌"); columnNames.addElement("车类型"); columnNames.addElement("座位数"); columnNames.addElement("查询方式"); columnNames.addElement("备注"); columnNames.addElement("添加人"); columnNames.addElement("图片"); //={"序号","车牌","车型","座位数","查询方式","录入人","录入时间","备注"};//列名字 Vector tableValue=sc.selectAll(); ResultTable = new JTable(tableValue,columnNames); //创建显示表格滚动的面板 scrollPaneForRusultTable = new JScrollPane(); scrollPaneForRusultTable.setBounds(60, 90, 800, 800); mainframe.getContentPane().add(scrollPaneForRusultTable); scrollPaneForRusultTable.setViewportView(ResultTable); //单机ResultTable窗体弹出对话框 ResultTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); ResultTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { JOptionPane.showMessageDialog(null, ResultTable.getValueAt(ResultTable.getSelectedRow(),1),"错误提示",JOptionPane.ERROR_MESSAGE); /*if(e.getClickCount()==2) { System.out.println(x); }*/ } }); //结果显示的表窗体 /* String[] columnNames={"序号","车牌","车型","座位数","查询方式","录入人","录入时间","备注"}; tableModel.addColumn(columnNames); cars=sc.selectAll(); tableModel.addRow(cars);*/ mainframe.setBounds(100, 100, 1000, 1000); mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ``` ```
Java swing 表格每行后嵌入删除按钮,点击按钮删除该行,但点击按钮所有行删剩最后一行时报错,如何解决?
![图片说明](https://img-ask.csdn.net/upload/201908/03/1564815909_864409.jpg) ``` package mytest; import java.awt.Component; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.table.*; import org.jfree.xml.generator.ModelBuilder; public class T extends JFrame{ private static final long serialVersionUID = 1L; static JTable table = null; static DefaultTableModel model=null; static JScrollPane js=null ; public T(){ model = new DefaultTableModel( new String[] { "课程名","教师","学分","学时","课程类别","课程性质","上课地点","上课时间","余量","" },2 ); table = new JTable(model); table.getColumnModel().getColumn(9).setCellEditor(new MyRender());//设置编辑器 table.getColumnModel().getColumn(9).setCellRenderer(new MyRender() ); js = new JScrollPane(table); this.add(js); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.setSize(399, 300); this.setLocationRelativeTo(null); } public static void main(String[] args) { // TODO Auto-generated method stub new T(); } } //渲染 器 编辑器 class MyRender extends AbstractCellEditor implements TableCellRenderer,ActionListener, TableCellEditor{ private static final long serialVersionUID = 1L; private JButton button =null; public MyRender(){ button = new JButton("删除"); button.addActionListener(this); } @Override public Object getCellEditorValue() { // TODO Auto-generated method stub return null; } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { // TODO Auto-generated method stub return button; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub int row = T.table.getSelectedRow(); if(row != -1){ T.model.removeRow(row); } } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { // TODO Auto-generated method stub return button; } ```
关于Jpanel, JScrollPane ,Jtable嵌套使用的问题
如题,我先建了一个继承了JPanel的 ListAddMainPanel。在这个ListAddMainPanel中,我嵌套了一个JScrollPane类的panel_1,在这个JScrollPane里,我放置了一个Jtable,Jtable 使用了DefaultTableModel。(可能看着有点晕,其实很简单,就是下面的那个图片) 使用时,我是在JFrame里的contentPane里先新建一个底层Panel,然后调用这个ListAddMainPanel的构造函数。想要给Table里加数据时,调用这个ListAddMainPanel里之前写好的fulfillTable函数 菜鸟觉得这个架构理论上应该行得通,但是问题来了,无论我使用什么样的方法,比如addRow();addColumn();setColumnIdentifiers(); 测试显示没有问题,数据也传进去了,程序也没报错,可他的界面就是没有出现表格_(:зゝ∠)_ 换了很多种方法,都没奏效,于是默默来求大佬帮助_(:зゝ∠)_ ![图片说明](https://img-ask.csdn.net/upload/2 ``` package w.teacher; import java.awt.Dimension; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.JTextField; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JComboBox; public class ListAddMainPanel extends JPanel { // private JTable table1,table2,table3,table4,table5; public JLabel timeLabel; public JTable table; public DefaultTableModel tableModel; public JTextField textField; public JComboBox<String> gradeBox; public JButton addButton,importButton; /** * Create the panel. */ public ListAddMainPanel() { setLayout(null); setPreferredSize(new Dimension(856, 417)); setOpaque(false); JScrollPane panel_1 = new JScrollPane(table); panel_1.setBounds(14, 72, 493, 319); panel_1.setLayout(null); panel_1.setVisible(true); add(panel_1); //Table table = new JTable(tableModel); // tableModel = (DefaultTableModel)table.getModel(); // table.setPreferredScrollableViewportSize(new Dimension(493,319));//设置table大小 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//关闭表格列自动调整,此时水平滚动条可见 // table.setBounds(0, 0, 493, 319); panel_1.add(table);//原位置Table代码 table.setVisible(true); // tableModel.setColumnIdentifiers(name1111); panel_1.setViewportView(table);//原位置Table代码 } public void fulfillTable(String[] title,String[][] data) { // for(int i = 0;i<100;i++){ // for(int j = 0;j<7;j++) // System.out.println(data[i][j]); // } // tableModel = new DefaultTableModel(data, name); // table = new JTable(tableModel); if(title!=null) { for(int i = 0;i<title.length;i++) { tableModel.addColumn(title[i]); } } for(int i = 0;data[i+1][0]!=null;i++) { String[] mString = new String[data[i].length]; for(int y = 0;y<7;y++) { mString[y] = data[i][y]; System.out.println(mString[y]); } tableModel.addRow(mString); // System.out.println(mString); } } ```
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
【图解经典算法题】如何用一行代码解决约瑟夫环问题
约瑟夫环问题算是很经典的题了,估计大家都听说过,然后我就在一次笔试中遇到了,下面我就用 3 种方法来详细讲解一下这道题,最后一种方法学了之后保证让你可以让你装逼。 问题描述:编号为 1-N 的 N 个士兵围坐在一起形成一个圆圈,从编号为 1 的士兵开始依次报数(1,2,3…这样依次报),数到 m 的 士兵会被杀死出列,之后的士兵再从 1 开始报数。直到最后剩下一士兵,求这个士兵的编号。 1、方...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
GitHub标星近1万:只需5秒音源,这个网络就能实时“克隆”你的声音
作者 | Google团队 译者 | 凯隐 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) 本文中,Google 团队提出了一种文本语音合成(text to speech)神经系统,能通过少量样本学习到多个不同说话者(speaker)的语音特征,并合成他们的讲话音频。此外,对于训练时网络没有接触过的说话者,也能在不重新训练的情况下,仅通过未知...
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
【管理系统课程设计】美少女手把手教你后台管理
【文章后台管理系统】URL设计与建模分析+项目源码+运行界面 栏目管理、文章列表、用户管理、角色管理、权限管理模块(文章最后附有源码) 1. 这是一个什么系统? 1.1 学习后台管理系统的原因 随着时代的变迁,现如今各大云服务平台横空出世,市面上有许多如学生信息系统、图书阅读系统、停车场管理系统等的管理系统,而本人家里就有人在用烟草销售系统,直接在网上完成挑选、购买与提交收货点,方便又快捷。 试想,若没有烟草销售系统,本人家人想要购买烟草,还要独自前往药...
4G EPS 第四代移动通信系统
目录 文章目录目录4G 与 LTE/EPCLTE/EPC 的架构E-UTRANE-UTRAN 协议栈eNodeBEPCMMES-GWP-GWHSSLTE/EPC 协议栈概览 4G 与 LTE/EPC 4G,即第四代移动通信系统,提供了 3G 不能满足的无线网络宽带化,主要提供数据(上网)业务。而 LTE(Long Term Evolution,长期演进技术)是电信领域用于手机及数据终端的高速无线通...
日均350000亿接入量,腾讯TubeMQ性能超过Kafka
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】近日,腾讯开源动作不断,相继开源了分布式消息中间件TubeMQ,基于最主流的 OpenJDK8开发的Tencent Kona JDK,分布式HTAP数据库 TBase,企业级容器平台TKEStack,以及高性能图计算框架Plato。短短一周之内,腾讯开源了五大重点项目。其中,TubeMQ是腾讯大数据平台部门应用的核心组件,...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车?某胡同口的煎饼摊一年能卖出多少个煎饼?深圳有多少个产品经理?一辆公交车里能装下多少个乒乓球?一个正常成年人有多少根头发?这类估算问题,被称为费米问题,是以科学家费米命名的。为什么面试会问这种问题呢?这类问题能把两类人清楚地区分出来。一类是具有文科思维的人,擅长赞叹和模糊想象,它主要依靠的是人的第一反应和直觉,比如小孩...
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问