有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

不带列名的java DefaultTableModel

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

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;
}

}  

主课

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();
}

}

共 (2) 个答案

  1. # 1 楼答案

    您可能没有将表放在JScrollPane中,这就是为什么它没有绘制标题。或者调用getTableHeader()并单独添加它。引用JTable{a1}

    Note that if you wish to use a JTable in a standalone view (outside of a JScrollPane) and want the header displayed, you can get it using getTableHeader() and display it separately.

    编辑:要将组件添加到JScrollPane中,请将该组件提供给JScrollPane的构造函数,或调用JScrollPane.setViewportView(component)

  2. # 2 楼答案

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

    所以改变:

    pa.add(table);
    

    致:

    pa.getViewport().add(table);
    

    看看会发生什么