Java JTable构造函数的替代方案

Java JTable构造函数的替代方案,java,swing,jtable,Java,Swing,Jtable,在花了无数个小时使用Swing并尽力学习之后,我遇到了这个问题。在讨论确切的问题之前,我想简要介绍一下情况。如果您立即注意到该问题,请随时跳过此部分 在过去的3天里,我一直在使用JTables(或者至少在尝试)。我对JTable构造函数有几个问题: JTable(Object[][] rowData, Object[] columnNames) 在反复阅读之后,我偶然发现了一组关于JTable构造函数的观点(使用它的缺点): 它们会自动使每个单元格都可编辑 它们将所有数据类型视为相同的(字符

在花了无数个小时使用Swing并尽力学习之后,我遇到了这个问题。在讨论确切的问题之前,我想简要介绍一下情况。如果您立即注意到该问题,请随时跳过此部分

在过去的3天里,我一直在使用JTables(或者至少在尝试)。我对JTable构造函数有几个问题:

JTable(Object[][] rowData, Object[] columnNames)
在反复阅读之后,我偶然发现了一组关于JTable构造函数的观点(使用它的缺点):

  • 它们会自动使每个单元格都可编辑

  • 它们将所有数据类型视为相同的(字符串)。例如,如果表列具有布尔数据,则该表可以在复选框中显示数据。但是,如果使用前面列出的两个JTable构造函数中的任何一个,则布尔数据将显示为字符串。您可以在上图的素食列中看到这一差异

  • 它们要求您将表的所有数据放在一个数组或向量中,这可能不适合某些数据。例如,如果要从数据库实例化一组对象,可能需要直接查询对象的值,而不是将其所有值复制到数组或向量中

第一点和第三点都给了我一些问题,所以我想问几个问题:

  • 如何使单个列宽保持静态,现在,所有列宽都是均匀的,并且在调整大小时缩放均匀。这是一个问题,因为“ID”列显然不需要像“E-mail”列那样多的空间

  • 出于某种奇怪的原因,我在显示列名时也遇到了问题,我的字符串[]columnNames被传递到构造函数中,但框架上没有显示任何内容


  • JTable代码:
    整个JFrame类:
    import javax.swing.*;
    导入javax.swing.border.EmptyBorder;
    导入javax.swing.table.TableModel;
    导入java.awt.*;
    公共类JDatabaseMainFrame扩展了JFrame{
    私立JTable studentsJTable;
    私有JPanel内容窗格;
    公共JDatabaseMainFrame(){
    JFrame=newjframe(“JDatabase”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle(“JDatabase”);
    可设置大小(真);
    设置最小尺寸(新尺寸(850350));
    contentPane=newjpanel();
    setboorder(新的EmptyBorder(5,5,5,5));
    setContentPane(contentPane);
    setLayout(新的CardLayout(0,0));
    //添加选项卡
    JTabbedPane tabbedPane=新的JTabbedPane(JTabbedPane.LEFT);
    添加(选项卡窗格,“选项卡”);
    //添加学生面板
    JPanel studentsPanel=新的JPanel();
    tabbedPane.addTab(“学生”,null,studentsPanel,null);
    studentsPanel.setLayout(新边界布局(0,0));
    //将JTable添加到学生面板
    JTable studentsJTable=addStudentsJTable();
    添加(studentsJTable,BorderLayout.CENTER);
    //添加教师面板
    JPanel teachersPanel=新的JPanel();
    tabbedPane.addTab(“教师”,null,教师面板,null);
    //添加Outing的面板
    JPanel outingsPanel=newjpanel();
    addTab(“Outings”,null,outingsPanel,null);
    挫折(200650650);
    包装();
    setVisible(真);
    }
    私有void打印数据(JTable JTable){
    int numberOfRows=jTable.getRowCount();
    int numberOfColumns=jTable.getColumnCount();
    TableModel model=jTable.getModel();
    for(int i=0;i


    请随意编译以查看当前结果

    您应该设置一个自定义TableModel,这样您就可以使用您想要的任何数据结构而不是数组:

    这还允许您指定哪些单元格是可编辑的

    只需在TableColumn类中调用适当的方法,就可以设置JTable列的宽度。更多信息请点击此处:

    JTable头只有在JScrollPane中才会自动显示。您确实将JTable添加到JScrollPane中,但随后您不会对该JScrollPane执行任何操作。JScrollPane本身必须位于JFrame中的某个位置

    private JTable addStudentsJTable(){
        String[] columnNames = {
                "Teacher ID",
                "Student ID",
                "Name",
                "Surname",
                "E-mail",
                "Date of Birth",
                "Telephone",
                "Course",
                "OOP",
                "Year of Membership",
                "Consent"};
    
        Object[][] data = {
                {1, 1, "Random", "Student", "Student@email.com", "1/1/1970", 9999999, "MC", true, 2014, true},
                {2, 2, "Student", "Surname", "RandomStudent@email.com", "1/1/1970", 11111111, "AIO", true, 2000, true}
        };
        studentsJTable = new JTable(data, columnNames);
    
        studentsJTable.setPreferredScrollableViewportSize(new Dimension(850,200));
        studentsJTable.setFillsViewportHeight(true);
    
        JScrollPane scrollPane = new JScrollPane(studentsJTable);
        add(scrollPane);
        return studentsJTable;
    }
    
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    import javax.swing.table.TableModel;
    import java.awt.*;
    
    public class JDatabaseMainFrame extends JFrame {
        private JTable studentsJTable;
        private JPanel contentPane;
    
    public JDatabaseMainFrame(){
        JFrame frame = new JFrame("JDatabase");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
        setTitle("JDatabase");
        setResizable(true);
        setMinimumSize(new Dimension(850,350));
    
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new CardLayout(0, 0));
    
        //Adding tabs
        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT);
        contentPane.add(tabbedPane, "Tabs");
    
        //Adding Student's panel
        JPanel studentsPanel = new JPanel();
        tabbedPane.addTab("Students", null, studentsPanel, null);
        studentsPanel.setLayout(new BorderLayout(0, 0));
    
        //Adding JTable to Student's panel
        JTable studentsJTable = addStudentsJTable();
        studentsPanel.add(studentsJTable, BorderLayout.CENTER);
    
        //Adding Teacher's panel
        JPanel teachersPanel = new JPanel();
        tabbedPane.addTab("Teachers", null, teachersPanel, null);
    
        //Adding Outing's panel
        JPanel outingsPanel = new JPanel();
        tabbedPane.addTab("Outings", null, outingsPanel, null);
    
        setBounds(200,200,650,650);
        pack();
        setVisible(true);
    }
    
    private void printData(JTable jTable){
        int numberOfRows = jTable.getRowCount();
        int numberOfColumns = jTable.getColumnCount();
    
        TableModel model = jTable.getModel();
    
        for(int i = 0; i < numberOfRows; i++){
            System.out.println("Row: " + i + ":");
            for(int j = 0; j < numberOfColumns; j++){
                System.out.println("  " + model.getValueAt(i, j));
            }
            System.out.println();
        }
        System.out.println("-------------------------------");
    }
    
    private JTable addStudentsJTable(){
        String[] columnNames = {
                "Teacher ID",
                "Student ID",
                "Name",
                "Surname",
                "E-mail",
                "Date of Birth",
                "Telephone",
                "Course",
                "OOP",
                "Year of Membership",
                "Consent"};
    
        Object[][] data = {
                {1, 1, "Random", "Student", "Student@email.com", "1/1/1970", 9999999, "MC", true, 2014, true},
                {2, 2, "Student", "Surname", "RandomStudent@email.com", "1/1/1970", 11111111, "AIO", true, 2000, true}
        };
        studentsJTable = new JTable(data, columnNames);
    
        studentsJTable.setPreferredScrollableViewportSize(new Dimension(850,200));
        studentsJTable.setFillsViewportHeight(true);
    
        JScrollPane scrollPane = new JScrollPane(studentsJTable);
        add(scrollPane);
        return studentsJTable;
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JDatabaseMainFrame frame = new JDatabaseMainFrame();
                frame.setVisible(true);
            }
        });
    }
    }