JTable列不会出现

时间:2014-08-06 08:07:28

标签: java mysql swing jdbc jtable

我遇到了JTable列的问题。我创建了JTable,但是列不会出现。是的,我尝试了之前提出的关于这个问题的问题,说关于添加一个JScrollPane但是将ScrollPane完全摧毁了我的表并且表格不可见。

我在此链接(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 个答案:

答案 0 :(得分:2)

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

}

没有布局管理员......

without without

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的核心概念之一...布局管理器

答案 1 :(得分:1)

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

JTableHeader tableHeader = table.getTableHeader();
frame.getContentPane().add(tableHeader);

答案 2 :(得分:0)

您必须将表格包裹在这样的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