0

你好朋友这是我的程序一切都很好。但我无法在 JTable 顶部显示列名。我应该做哪些改变来展示它?并且还告诉我如何给这张桌子提供滚动条(垂直的,水平的)。

提前致谢..

报告1.Java:

package com.ash;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.spi.DirStateFactory.Result;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTable;
    public class Report1 extends JFrame {

Object[][] data = null;


private JPanel contentPane;

/**
 * Launch the application.
 */
ResultSet rs,rs1;
Statement stmt=null;
int k=0;
PreparedStatement pr;
public JTable table;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Report1 frame = new Report1();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public Report1() {
    setTitle("Report");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 953, 616);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    table = new JTable();
    table.setBounds(100, 136, 810, 431);
    contentPane.add(table);

    JButton btnNewButton = new JButton("Add");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {




            try {
                NewPatient.con=DbConnPa.getConObj();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            String sql="SELECT COUNT (*) FROM newpatient1";
            try {
                pr=NewPatient.con.prepareStatement(sql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                rs=pr.executeQuery(sql);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                rs.next();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int count = 0;
            try {
                count = rs.getInt(1);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(count);


            data= new Object [count][6];


            try {
                stmt=NewPatient.con.createStatement();
            } catch (SQLException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }

            String sql1="SELECT * FROM newpatient1";

            Object[] columns={"FirstName","LastName","Age","RefDoctor","Sex","RegId"};

            try {
                rs1=stmt.executeQuery(sql1);
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            try {


                    while(rs1.next()){

                        for(int j=0;j<6;j++){
                            try {
                                data[k][j]=rs1.getString(j+1);
                                System.out.println("i="+"j="+j);
                            } catch (SQLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    k++;}
                }

             catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }



            table.setModel(new DefaultTableModel(data, columns));



        }
    });
    btnNewButton.setBounds(382, 47, 89, 23);
    contentPane.add(btnNewButton);


}
   }
4

1 回答 1

4

让我们从所有让我害怕的事情开始......

// This will come back and haunt you...
contentPane.setLayout(null);

table = new JTable();
// You should leave this up to the layout manager, but you're not using one, so...
table.setBounds(100, 136, 810, 431);

而现在的问题...

预计表格将大于执行此操作的可用可视区域...

contentPane.add(table);

不是它应该如何工作。

您应该使用JScrollPane. 这为要显示的标题提供了区域...

在此处输入图像描述

contentPane.add(new JScrollPane(table));

查看如何使用表格如何使用滚动窗格

最终,您将希望熟悉Swing 中的并发,因为从数据库中读取结果可能是一项长时间运行的任务,从而导致您的应用程序停止运行

更新示例

我还浏览了你的数据重试代码并“清理了它”,这相当……有趣

public Report1() {
    setTitle("Report");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 953, 616);
    ((JComponent) getContentPane()).setBorder(new EmptyBorder(5, 5, 5, 5));

    table = new JTable();
    add(new JScrollPane(table));

    JButton btnNewButton = new JButton("Add");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            PreparedStatement pr = null;
            ResultSet rs = null;
            Statement stmt = null;
            try {
                NewPatient.con = DbConnPa.getConObj();
                String sql = "SELECT COUNT (*) FROM newpatient1";
                pr = NewPatient.con.prepareStatement(sql);
                rs = pr.executeQuery(sql);
                if (rs.next()) {
                    int count = 0;
                    count = rs.getInt(1);
                    System.out.println(count);
                    rs.close();

                    data = new Object[count][6];

                    stmt = NewPatient.con.createStatement();

                    String sql1 = "SELECT * FROM newpatient1";

                    Object[] columns = {"FirstName", "LastName", "Age", "RefDoctor", "Sex", "RegId"};

                    rs = stmt.executeQuery(sql1);

                    while (rs.next()) {

                        for (int j = 0; j < 6; j++) {
                            data[k][j] = rs1.getString(j + 1);
                            System.out.println("i=" + "j=" + j);
                        }
                        k++;
                    }
                }

                table.setModel(new DefaultTableModel(data, columns));
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    rs.close();
                } catch (Exception e) {
                }
                try {
                    pr.close();
                } catch (Exception e) {
                }
                try {
                    stmt.close();
                } catch (Exception e) {
                }
            }

        }
    });
    add(btnNewButton, BorderLayout.SOUTH);
}
于 2013-04-25T05:56:18.970 回答