无法显示选项卡式 JTable 的 table header
Can't show table header of tabbed JTable
我有一个 JTabbedPane
,它的选项卡中包含三个 table。 JTabbedPane
同样位于 JScrollPane
中。我想为每个 table 显示一个修复程序 table header,它遵循架构 {"Client", "Action", "Location", "Value"}
。当我尝试在 ActionListener
中设置 header 时(见下文),我可以自由选择其他方法(例如,最初设置 header)。
其他 SO-posts 正在解决同样的问题,但我无法显示 table header。唯一有效的是将数据添加到上述 ActionListener
中的 table。我不明白为什么 header 没有显示,因为我以 String
-矩阵的形式传递数据以及代表 header 的 String
-数组].
首先,这是关于我的 table 的代码片段,它在 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
。目前我正试图让它与一个 table: tableMainTest
一起工作。这就是我尝试定义 table header:
的方式
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
是 String-arrays 的列表
dataMatrixMain
是 String
矩阵,它将用于用数据 填充我的 table
有谁知道,必须更改什么才能使 header 可见?
编辑:
程序启动后,用户将看到我的 table 处于以下状态:
用户只会看到三个选项卡,其中 table 都是空的。
用内容填充 table 是用户的工作。从 JList
中选取一个元素并提交后,table 将按以下方式填充:
从JList
中选择的元素每次提交后,将直接显示在JTable
中。我通过设置 JTable
的 DefaultTableModel
来做到这一点。因此显示输入的元素按预期工作。只有 header 没有显示在条目上方。
编辑 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);
}
}
我自己找到了解决方案。解决方案只是对每个 table 使用 JScrollPane
,它包含在 JTabbedPane
中。之前,整个 JTabbedPane
被包裹在一个 JScrollPane
中。现在,每个选项卡都包含一个 JScrollPane
而不是 JTable
。虽然删除旧的 JScrollPane
并将 table 打包成一个自己的代码听起来很简单,但更改剩余代码、修复它并使新代码适合布局需要一些努力GUI 的。
我找到了一个很好的代码示例,它应该是什么样子 here。
您可以在下面找到代码示例 JTabbedPane
、JScrollPane
和 JTables
的组合如何工作:
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);
我有一个 JTabbedPane
,它的选项卡中包含三个 table。 JTabbedPane
同样位于 JScrollPane
中。我想为每个 table 显示一个修复程序 table header,它遵循架构 {"Client", "Action", "Location", "Value"}
。当我尝试在 ActionListener
中设置 header 时(见下文),我可以自由选择其他方法(例如,最初设置 header)。
其他 SO-posts 正在解决同样的问题,但我无法显示 table header。唯一有效的是将数据添加到上述 ActionListener
中的 table。我不明白为什么 header 没有显示,因为我以 String
-矩阵的形式传递数据以及代表 header 的 String
-数组].
首先,这是关于我的 table 的代码片段,它在 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
。目前我正试图让它与一个 table: tableMainTest
一起工作。这就是我尝试定义 table header:
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
是 String-arrays 的列表
dataMatrixMain
是String
矩阵,它将用于用数据 填充我的 table
有谁知道,必须更改什么才能使 header 可见?
编辑:
程序启动后,用户将看到我的 table 处于以下状态:
用户只会看到三个选项卡,其中 table 都是空的。
用内容填充 table 是用户的工作。从 JList
中选取一个元素并提交后,table 将按以下方式填充:
从JList
中选择的元素每次提交后,将直接显示在JTable
中。我通过设置 JTable
的 DefaultTableModel
来做到这一点。因此显示输入的元素按预期工作。只有 header 没有显示在条目上方。
编辑 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);
}
}
我自己找到了解决方案。解决方案只是对每个 table 使用 JScrollPane
,它包含在 JTabbedPane
中。之前,整个 JTabbedPane
被包裹在一个 JScrollPane
中。现在,每个选项卡都包含一个 JScrollPane
而不是 JTable
。虽然删除旧的 JScrollPane
并将 table 打包成一个自己的代码听起来很简单,但更改剩余代码、修复它并使新代码适合布局需要一些努力GUI 的。
我找到了一个很好的代码示例,它应该是什么样子 here。
您可以在下面找到代码示例 JTabbedPane
、JScrollPane
和 JTables
的组合如何工作:
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);