【问题标题】:Can't show table header of tabbed JTable无法显示选项卡式 JTable 的表头
【发布时间】:2016-11-16 00:15:14
【问题描述】:

我有一个JTabbedPane,它的选项卡中包含三个表格。 JTabbedPane 再次位于 JScrollPane 中。我想为每个表显示一个修复表头,它遵循架构{"Client", "Action", "Location", "Value"}。当我尝试在 ActionListener 中设置标题时(见下文),我可以使用其他方法(例如,最初设置标题)。

其他 SO 帖子正在解决相同的问题,但我无法显示表格标题。唯一有效的是将数据添加到提到的ActionListener 中的表中。我不明白为什么不显示标题,因为我以String-matrix 和代表标题的String-array 的形式传递数据。

首先,这是关于我的表的代码的 sn-p,它在 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);

下面又是一个代码 sn-p,但这次来自提到的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);
  • header 是一个 String 数组,形式为 {"Client", "Action", "Location", "Value"}
  • itemListMain 是一个字符串数组列表
  • dataMatrixMainString-matrix,将用于在我的表中填充数据

有谁知道,要使标题可见,必须进行哪些更改?

编辑:

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

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

用内容填充表格是用户的工作。从JList 中选择一个元素并提交后,表格将按以下方式填充:

每次提交来自JList的选中元素后,会直接显示在JTable中。我通过设置DefaultTableModelJTable 来做到这一点。所以显示输入的元素就像预期的那样工作。只有标题不显示在条目上方。

编辑 2:SSCCE

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;
import javax.swing.table.DefaultTableModel;


public class GUIMain{

    private JFrame frmKeyoperateTestframework;

    public JTable tableBefore;
    public JTable tableMainTest;
    public JTable tableAfter;

    public JTabbedPane tabbedPane;
    public JScrollPane scrollTables;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUIMain window = new GUIMain();
                    window.frmKeyoperateTestframework.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public GUIMain() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {

    frmKeyoperateTestframework = new JFrame();
    frmKeyoperateTestframework.setResizable(false);
    frmKeyoperateTestframework.getContentPane().setBackground(Color.WHITE);
    frmKeyoperateTestframework.setFont(new Font("Carlito", Font.PLAIN, 14));
    frmKeyoperateTestframework.setTitle("GUI");
    frmKeyoperateTestframework.setBounds(100, 100, 865, 584);
    frmKeyoperateTestframework.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frmKeyoperateTestframework.getContentPane().setLayout(null);

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

    scrollTables = new JScrollPane();
    scrollTables.setBounds(446, 50, 397, 490);
    scrollTables.setViewportView(tabbedPane);
    frmKeyoperateTestframework.getContentPane().add(scrollTables);

    // "5" to show, that only data rows are displayed
    DefaultTableModel tableModel = new DefaultTableModel(new String[]{"Client", "Action", "Location", "Value"}, 5); 

    tableBefore = new JTable();
    tableBefore.setName("tableBefore");
    tableBefore.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    tableBefore.setModel(tableModel);
    tabbedPane.addTab("Before", null, tableBefore, null);
    tableBefore.setFont(new Font("Carlito", Font.PLAIN, 13));
    tableBefore.setFocusable(false);

    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);
    tabbedPane.addTab("Main", null, tableMainTest, null);
    tabbedPane.setEnabledAt(1, true);

    tableAfter = new JTable();
    tableAfter.setName("tableAfter");
    tableAfter.setModel(tableModel);
    tableAfter.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    tabbedPane.addTab("After", null, tableAfter, null);
    tableAfter.setFont(new Font("Carlito", Font.PLAIN, 13));
    tableAfter.setFocusable(false);

    tabbedPane.setSelectedComponent(tableMainTest);
}
}

【问题讨论】:

  • 您能否提供一个可运行的示例 (SSCCE),以便我重现您的问题并尝试解决它?
  • @SergiyMedvynskyy 我添加了一个 SSCCE。请参阅我更新的帖子。我知道,问题可能是,该表不直接在 JScrollPane 内,我已经尝试移动它们,但后来我再也看不到我的标签了。

标签: java swing jtable jtabbedpane jtableheader


【解决方案1】:

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

我找到了一个很好的代码示例,它应该看起来像 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);

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多