有 Java 编程相关的问题?

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

JTable java列不会显示

我对JTable列有问题。我创建了JTable,但是列不会显示。是的,我尝试了之前提出的关于这个问题的问题,说是关于添加一个JScrollPane,但是将滚动窗格放在里面会完全破坏我的表,并且该表不可见

我从这个链接(JTable won't show column headers)尝试了frame.getContentPane.add(new JScrollPane(table)),但没有像我上面所说的那样产生任何效果

我没有使用布局管理器

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test1?user=me&password=12345");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM consoles INNER JOIN hardware ON consoles.id=hardware.id");
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
String[] cols = new String[columnCount];
   for (i=1;i<= columnCount;i++)
     {
        cols[i-1] = md.getColumnName(i);
     }
DefaultTableModel model = new DefaultTableModel(cols,0);
    while (rs.next())
     {
        Object[] row = new Object[columnCount];
          for (i = 1 ; i <= columnCount ; i++)
            {
              row[i-1] = rs.getObject(i);
            }
       model.addRow(row);
     }
JTable table = new JTable(model);
model.fireTableDataChanged();
table.setCellSelectionEnabled(true);
table.setColumnSelectionAllowed(true);
table.setFillsViewportHeight(true);
table.setSurrendersFocusOnKeystroke(true);
table.setBounds(146,59,763,360);
frame.getContentPane().add((table));
model.fireTableDataChanged();
}

共 (3) 个答案

  1. # 1 楼答案

    或者,您必须将表包装为JScrollPane,如下所示:

    frame.getContentPane().add(new JScrollPane(table));
    

    或者必须单独添加表格标题:

    frame.getContentPane().add(table.getTableHeader, BorderLayout.NORTH);
    frame.getContentPane().add(table); // By default this adds to CENTER
    

    这假定内容窗格的布局管理器是默认的BorderLayout

  2. # 2 楼答案

    您可以尝试从表中获取TableHeader并将其添加到ContentPane:

    JTableHeader tableHeader = table.getTableHeader();
    frame.getContentPane().add(tableHeader);
    
  3. # 3 楼答案

    JTable设计用于JScrollPane,例如,它会自动将TableHeader添加到滚动窗格中

    而不是

    frame.getContentPane().add((table));
    

    尝试使用

    frame.getContentPane().add(new JScrollPane(table));
    

    有关详细信息,请参见How to Use Tables

    Tables

    注意,您应该避免使用setBounds,而应该使用适当的布局管理器,您还应该避免使用null布局,像素完美的布局在现代ui设计中是一种错觉。影响零部件单个尺寸的因素太多,您无法控制。Swing的设计初衷是与布局管理器一起工作,丢弃这些布局管理器将导致无止境的问题,您将花费越来越多的时间来纠正这些问题

    已更新

    您不应该在模型上调用fireTableDataChanged或任何其他事件方法,它们不是供您使用的,而是供模型内使用的

    在将表格/滚动窗格添加到内容窗格之前,请尝试以下操作

    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(new JScrollPane(table));
    

    让我来演示一下

    使用布局管理器

    With layout

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.table.DefaultTableModel;
    
    public class TableExample {
    
        public static void main(String[] args) {
            new TableExample();
        }
    
        public TableExample() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    int columnCount = 10;
                    String[] cols = new String[columnCount];
                    for (int i = 1; i <= columnCount; i++) {
                        cols[i - 1] = Integer.toString(i);
                    }
                    DefaultTableModel model = new DefaultTableModel(cols, 0);
                    JTable table = new JTable(model);
    
                    table.setCellSelectionEnabled(true);
                    table.setColumnSelectionAllowed(true);
                    table.setFillsViewportHeight(true);
                    table.setSurrendersFocusOnKeystroke(true);
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new JScrollPane(table));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
    }
    

    没有布局管理器

    withoutwithout

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.table.DefaultTableModel;
    
    public class TableExample {
    
        public static void main(String[] args) {
            new TableExample();
        }
    
        public TableExample() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    int columnCount = 10;
                    String[] cols = new String[columnCount];
                    for (int i = 1; i <= columnCount; i++) {
                        cols[i - 1] = Integer.toString(i);
                    }
                    DefaultTableModel model = new DefaultTableModel(cols, 0);
                    JTable table = new JTable(model);
    
                    table.setCellSelectionEnabled(true);
                    table.setColumnSelectionAllowed(true);
                    table.setFillsViewportHeight(true);
                    table.setSurrendersFocusOnKeystroke(true);
    
                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(null);
                    frame.add(new JScrollPane(table));
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
    }
    

    问题不在于您向我们展示的代码,问题在于您选择放弃Swing API所基于的核心概念之一。。。布局管理器