无法显示选项卡式JTable

时间:2016-07-13 11:59:22

标签: java swing jtable jtabbedpane jtableheader

我有一个JTabbedPane,其标签中包含三个表格。 JTabbedPane再次位于JScrollPane。我想为每个表显示一个修复表标题,它遵循模式{"Client", "Action", "Location", "Value"}。当我试图在ActionListener中设置标题时(见下文),我可以自由选择其他方法(例如,最初设置标题)。

其他SO帖子也解决了同样的问题,但我无法显示表格标题。唯一有效的方法是在上述ActionListener中向表中添加数据。我不明白为什么标题没有显示,因为我以String - 矩阵的形式传递数据以及表示标题的String数组。

首先,这里是关于我的表的代码片段,它在GUI的启动时执行(我的initialize() - 方法)。

    tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    tabbedPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    tabbedPane.setFont(new Font("Carlito", Font.PLAIN, 13));
    tabbedPane.setBackground(Color.WHITE);
    tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);

    tableBefore = new JTable();
    tabbedPane.addTab(descrTableBefore, null, tableBefore, null);
    tableBefore.setFont(new Font("Carlito", Font.PLAIN, 13));
    tableBefore.setFocusable(false);

    tableMainTest = new JTable();
    tabbedPane.addTab(descrTableMain, null, tableMainTest, null);
    tabbedPane.setEnabledAt(1, true);
    tableMainTest.setFont(new Font("Carlito", Font.PLAIN, 13));
    tableMainTest.setFocusable(false);

    tableAfter = new JTable();
    tabbedPane.addTab(descrTableAfter, null, tableAfter, null);
    tableAfter.setFont(new Font("Carlito", Font.PLAIN, 13));
    tableAfter.setFocusable(false);

    scrollTables = new JScrollPane();
    scrollTables.setBounds(442, 11, 397, 490);
    scrollTables.setViewportView(tabbedPane);
    frmTestframework.getContentPane().add(scrollTables);

下面再次是一段代码片段,但这次是从提到的ActionListener开始,它被添加到一个按钮,将元素添加到JTable。目前我正试图让它只使用一个表:tableMainTest。这就是我尝试定义表头的方式:

    dataMatrixMain = new String[itemListMain.size()][];

    for(int j = 0; j < itemListMain.size(); j++)
        dataMatrixMain[j] = itemListMain.get(j);

    modelMain = new DefaultTableModel(dataMatrixMain, header);

    mainGUI.tableMainTest.setModel(modelMain);
  • headerString - 数组,格式为{"Client", "Action", "Location", "Value"}
  • itemListMain是一个字符串数组列表
  • dataMatrixMainString - 矩阵,用于填充表格中的数据

有谁知道,必须更改哪些内容才能显示标题?

编辑:

当程序启动时,用户将看到我的表处于以下状态:

Table in the intial state

用户只会看到三个选项卡,哪些表都是空的。

使用内容填充表是用户作业。从JList中挑选元素并提交后,表格按以下方式填写:

Table filled with data

每次从JList提交所选元素后,它都会直接显示在JTable中。我是通过设置DefaultTableModel的{​​{1}}来完成此操作的。因此显示输入的元素就像预期的那样。只有标题不会显示在条目的上方。

编辑2:SSCCE

JTable

1 个答案:

答案 0 :(得分:7)

我自己找到了解决方案。解决方案只是为每个表使用JScrollPane,它包含在JTabbedPane中。之前,整个JTabbedPane被包裹在JScrollPane中。现在,每个标签都包含JScrollPane而不是JTable。虽然删除旧的JScrollPane并将表打包成自己的表听起来很简单,但是需要花费一些精力来更改剩余的代码,修复它,并使新代码适合GUI的布局。 / p>

我找到了一个很好的代码示例,它应该看起来像here

您可以在下面找到一个代码示例,说明JTabbedPaneJScrollPaneJTables的组合如何工作:

    tabbedPane = new JTabbedPane(JTabbedPane.TOP);
    tabbedPane.setBounds(446, 50, 397, 490);
    tabbedPane.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, null, null, null, null));
    tabbedPane.setFont(new Font("Carlito", Font.PLAIN, 13));
    tabbedPane.setBackground(Color.WHITE);
    frame.getContentPane().add(tabbedPane);  // JFrame

    tableMainTest = new JTable();
    tableMainTest.setName("tableMainTest");
    tableMainTest.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    tableMainTest.setFont(new Font("Carlito", Font.PLAIN, 13));
    tableMainTest.setFocusable(false);
    tableMainTest.setModel(tableModel);

    tableMainTest.setPreferredScrollableViewportSize(tableMainTest.getPreferredSize());
    tableMainTest.changeSelection(0, 0, false, false);
    tableMainTest.setAutoCreateRowSorter(true);

    JScrollPane scrollMain = new JScrollPane(tableMainTest);
    scrollMain.add(tableMainTest.getTableHeader());
    scrollMain.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
    scrollMain.setBounds(446, 50, 397, 490);

    tabbedPane.addTab(descrTableMain, scrollMain);