首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不带列名的DefaultTableModel

不带列名的DefaultTableModel
EN

Stack Overflow用户
提问于 2011-10-30 20:16:13
回答 2查看 5.3K关注 0票数 3

这个类与我的数据库通信,检索数据并将它们投影到一个JTable.我使用了DefaultTableModel,但是列名不会出现.我在另一个类中实例化这个类,在这个类中我通过getTable( )检索包含数据的表。

代码语言:javascript
复制
package jtable;

import javax.swing.*;
import javax.swing.table.*;
import java.sql.*;

public class ControlDatabase
{  
   private JTable table;
   private Statement stmt;
   private DefaultTableModel model;
   private String all = "SELECT * FROM Players ORDER BY id ASC";


public ControlDatabase( ) 
{
        String dbUsername = "root";
        String dbPassword = "*****";
        String dbHost = "localhost";
        String dbPort = "3306";
        String dbName = "oop_project_database";
        String url = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName; 
    try {
        Connection con = DriverManager.getConnection(url, dbUsername, dbPassword);

        model = new DefaultTableModel();
        model.addColumn("Id");
        model.addColumn("Onoma");
        model.addColumn("Epwnimo");
        model.addColumn("Age");
        model.addColumn("Nickname");
        table = new JTable(model); 

        stmt = con.createStatement();
        updateStatement( all );

    } catch (SQLException ex) {
        ex.printStackTrace(System.out);
    }

}

public void addStatement(String name,String surname,Integer age,String nickname )
{
  String query = "INSERT INTO Players (name,surname,age,nickname) VALUES ('"
                + name +
                "','"
                + surname +
                "',"
                + age +
                ",'"
               + nickname +
               "')";
  try {
        int x = stmt.executeUpdate( query );
        if (x > 0) {
            lastStatement(all);
               // updateStatement(all , true );
        }
      } catch (SQLException e)  {
        e.printStackTrace();
    }
}

public Boolean deleteStatement(String id , int row )
{
  String query = "DELETE FROM Players WHERE id = " + id ;
  try {
        int x = stmt.executeUpdate( query );
        if (x > 0) {
            model.removeRow(row);
            return true;
        }
        return false;

      } catch (SQLException e)  {
        e.printStackTrace();
        return false;
    }
}

public void updateStatement(String query , Boolean flag )
{
    try {
      ResultSet rs = stmt.executeQuery(  query );
        while (rs.next()) {
            int currentId = rs.getInt("id");
            String currentName = rs.getString("name");
            String currentSurname = rs.getString("surname");
            int currentAge = rs.getInt("age");
            String currentNick = rs.getString("nickname");

            Object[] currentRow = { currentId ,currentName, currentSurname, currentAge, currentNick };
            model.addRow(currentRow);
        }
    } catch (SQLException ex) {
        ex.printStackTrace(System.out);
    }
}

public void updateStatement(String query) {
    updateStatement(query , false );
}

public void lastStatement(String query )
{
    try {
      ResultSet rs = stmt.executeQuery(  query );

            rs.last();
            int currentId = rs.getInt("id");
            String currentName = rs.getString("name");
            String currentSurname = rs.getString("surname");
            int currentAge = rs.getInt("age");
            String currentNick = rs.getString("nickname");
            Object[] currentRow = { currentId ,currentName, currentSurname, currentAge, currentNick };
            model.addRow(currentRow);
    } catch (SQLException ex) {
        ex.printStackTrace(System.out);
    }
}

public JTable getTable( ) {
    return table;
}

}  

主类

代码语言:javascript
复制
package jtable;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class MainD extends JFrame{

   private JPanel p;
   //private JPanel pa;
   private JScrollPane pa; //<-- change
   private JSplitPane splitPane;
   private JButton b,ba;
   private JLabel ln,ls,la,lc;
   private JTextField txs,txn,txa,txc;
   private ControlDatabase data;
   private JTable table;

   public MainD()
   {
     super("Split");
p = new JPanel(new GridLayout(5,2));
//pa = new JPanel(new GridLayout(1,1));
pa = new JScrollPane( ); //<--
ln = new JLabel("Name");
txn = new JTextField();
ls = new JLabel("Surname");
txs = new JTextField();
la = new JLabel("Age");
txa = new JTextField();
ba = new JButton("Add");
lc = new JLabel("Nickname");
txc = new JTextField();
ba.addActionListener(new ActionListener() { //Add
    public void actionPerformed(ActionEvent e){
        String name = txn.getText();
        String surname = txs.getText();
        String sage = txa.getText();

        String nickname = txc.getText();
        if (!( name.isEmpty() || surname.isEmpty() || nickname.isEmpty() || sage.isEmpty() )) {
            try {
                Integer age = Integer.parseInt( sage );
                data.addStatement(name,surname,age,nickname);
                txn.setText("");
                txs.setText("");
                txa.setText("");
                txc.setText("");
            }catch(NumberFormatException ex){
                System.out.println("Age must be an Integer");
            }

        }
        else{
            System.out.println("Empty Fields");
        }
    }
}
);
b = new JButton("Remove");
data = new ControlDatabase();
table = data.getTable();
pa.add(table);
b.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e){
        int row = table.getSelectedRow();
        String value = String.valueOf( table.getValueAt( row ,0 ) );
        data.deleteStatement( value , row );
    }
}
);
p.add(ln);
p.add(txn);
p.add(ls);
p.add(txs);
p.add(la);
p.add(txa);
p.add(lc);
p.add(txc);
p.add(ba);
p.add(b);
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, p, pa);
splitPane.setDividerLocation(280);
add(splitPane);
setBounds(200,200,800,400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
   }

public static void main(String[] args) {
       new MainD();
}

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-30 20:23:18

您可能没有将表放在JScrollPane中,这就是它不绘制标题的原因。或者调用getTableHeader()并单独添加。引用JTable javadoc

请注意,如果您希望在独立视图中使用JTable (在JScrollPane之外)并希望显示标题,则可以使用getTableHeader()获取它并单独显示它。

编辑:要将组件添加到JScrollPane,可以将组件交给JScrollPane的构造函数,也可以调用JScrollPane.setViewportView(component)

票数 6
EN

Stack Overflow用户

发布于 2011-10-30 21:13:51

您需要将组件添加到JScrollPane的视区,而不是滚动窗格本身。

因此,改变:

代码语言:javascript
复制
pa.add(table);

至:

代码语言:javascript
复制
pa.getViewport().add(table);

看看会发生什么。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7944819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档