Java JTable 列标题未显示 - JScrollPane?

标签 java swing jtable jpanel jscrollpane

Java GUI 新手。我一直在浏览 stackoverflow,但仍然不明白 JTables 是如何工作的。我可以完美地获取数据,但我无法弄清楚为什么列标题没有显示,以及如何将表格调整大小/位置到框架中的另一个位置。我一直在阅读有关使用 JScrollPane 的信息,我可能使用不正确。感谢您的帮助。

        String[] columnNames = {"Date","Field", "Home Team","Visitor Team", "Score"};
        JFrame guiFrame = new JFrame();
        guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        guiFrame.setTitle("Soccer Schedule");
        guiFrame.setSize(500,500);
        guiFrame.setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        panel.setSize(450, 450);
        JLabel titleLabel = new JLabel("Real Tired");
        String[][] data = createTableContents(scheduleCsv);
        JTable scheduleTable = new JTable(data,columnNames);
        JScrollPane scrollPane = new JScrollPane(scheduleTable);
        panel.add(scrollPane);
        panel.add(titleLabel);
        panel.add(scheduleTable);

        guiFrame.add(panel);
        guiFrame.setVisible(true);

最佳答案

问题不在于表格或 jscrollpane,而在于如何将它们放入面板中:

panel.add(scrollPane);
panel.add(titleLabel);
panel.add(scheduleTable);

首先,scheduleTable(视觉上)位于scrollPane内部,因此您只需放置scrollPane,而不是再次放置表格。所以我们想要:

panel.add(titleLabel); //first put the title
panel.add(scrollPane);

这很好用:

enter image description here

当我说它工作得很好时,我的意思是它工作得很好......偶然。当您增大窗口时,就会发现元素的真实布局:

enter image description here

问题又出现在这段代码中:

panel.add(titleLabel); //first put the title
panel.add(scrollPane);

这肯定会将组件(标签和滚动 Pane )添加到面板中,但是明显的问题是“面板中的何处添加它们?”。

那么答案是面板有一个 LayoutManager这决定了其组件的位置。其中有几个,你必须选择一个,了解它的工作原理并使用它,看看这个 visual guide .

由于您没有指定布局,panel 使用面板的默认布局 FlowLayout,它将组件一个接一个地并排放置。

查看教程选择一个布局,然后使用它。例如,我可以使用这样的 BorderLayout:

JPanel panel = new JPanel(new BorderLayout());
...
panel.add(titleLabel, BorderLayout.NORTH);
panel.add(scrollPane, BorderLayout.CENTER);

给予:

enter image description here

完整代码:

String[] columnNames = {"Date","Field", "Home Team","Visitor Team", "Score"};
JFrame guiFrame = new JFrame(); //no layout specified, frames use BorderLayout by default
guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
guiFrame.setTitle("Soccer Schedule");
guiFrame.setSize(500,500);
guiFrame.setLocationRelativeTo(null);

JPanel panel = new JPanel(new BorderLayout());
panel.setSize(450, 450);
JLabel titleLabel = new JLabel("Real Tired");

//String[][] data = createTableContents(scheduleCsv);

//my test data
String[][] data = new String[1][5];
for (int i = 0; i < 5; ++i)
{
    data[0][i] = "cell " + i;
}

JTable scheduleTable = new JTable(data,columnNames);
JScrollPane scrollPane = new JScrollPane(scheduleTable);
panel.add(titleLabel, BorderLayout.NORTH);
panel.add(scrollPane, BorderLayout.CENTER);

guiFrame.add(panel); //this is actually  guiFrame.add(panel, BorderLayout.CENTER);
guiFrame.setVisible(true);

关于Java JTable 列标题未显示 - JScrollPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22463157/

相关文章:

java - 了解 netty channel 缓冲区和水印

java - 在 jFrame 中禁用最大化并使用鼠标调整大小

java - 如何将jtable的内容复制到剪贴板

java - 创建对 JTable 数据的持久引用

java - JTable 最后一个值 null

java - Jtable 不可见?

java - Java 版纸牌克朗代克

java - 正则表达式 - 包含多个下划线的单词

java - CardLayout:找出当前项目是否是列表中的第一个/最后一个

java - 如何让这个 java for 循环在每次迭代之间暂停 1/2 秒?