Java 无法获取隐藏的JTable列
我使用带有两个按钮(活动和非活动按钮)的JTable。单击非活动按钮时,隐藏表的第一列。我还尝试在单击活动按钮时显示第一列。但问题是,当我点击活动按钮时,我无法显示具有首选大小的第一列 这是隐藏第一列的代码Java 无法获取隐藏的JTable列,java,swing,jtable,tablecolumn,Java,Swing,Jtable,Tablecolumn,我使用带有两个按钮(活动和非活动按钮)的JTable。单击非活动按钮时,隐藏表的第一列。我还尝试在单击活动按钮时显示第一列。但问题是,当我点击活动按钮时,我无法显示具有首选大小的第一列 这是隐藏第一列的代码 expTable.getColumnModel().getColumn(0).setMinWidth(0); expTable.getColumnModel().getColumn(0).setMaxWidth(0); expTable.getColumnModel().getColumn(
expTable.getColumnModel().getColumn(0).setMinWidth(0);
expTable.getColumnModel().getColumn(0).setMaxWidth(0);
expTable.getColumnModel().getColumn(0).setWidth(0);
expTable.getColumnModel().getColumn(0).setMinWidth(0);
expTable.getColumnModel().getColumn(0).setMaxWidth(300);
expTable.getColumnModel().getColumn(0).setWidth(100);
这是返回第一列的代码
expTable.getColumnModel().getColumn(0).setMinWidth(0);
expTable.getColumnModel().getColumn(0).setMaxWidth(0);
expTable.getColumnModel().getColumn(0).setWidth(0);
expTable.getColumnModel().getColumn(0).setMinWidth(0);
expTable.getColumnModel().getColumn(0).setMaxWidth(300);
expTable.getColumnModel().getColumn(0).setWidth(100);
首先单击非活动按钮,然后单击活动按钮。但这是行不通的
你知道怎么做吗
private void inactiveButtonActionPerformed(java.awt.event.ActionEvent evt){
expTable.getColumnModel().getColumn(0).setMinWidth(0);
expTable.getColumnModel().getColumn(0).setMaxWidth(0);
expTable.getColumnModel().getColumn(0).setWidth(0);
}
private void activeButtonActionPerformed(java.awt.event.ActionEvent evt)
{
expTable.getColumnModel().getColumn(0).setMinWidth(0);
expTable.getColumnModel().getColumn(0).setMaxWidth(300);
expTable.getColumnModel().getColumn(0).setWidth(100);
}
不要试图通过使用宽度来“隐藏”表列。TableColumn
仍然是表的一部分,因此当用户从一列到另一列进行制表时,焦点将转到隐藏列,并从用户视图中消失,这非常混乱
相反,您应该从TableColumnModel
中删除TableColumn
。然后,您可以根据需要将TableColumn
添加回TableColumnModel
请查看为您管理此概念的。如果您没有使用该类的全部功能,可以使用
hideColumn(…)
和showColumn(…)
在第一列上进行简单切换。过去,当我需要执行类似操作时,我只需删除并重新添加TableColumn
这是一个相当粗糙的概念示例
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class Main {
public static void main(String[] args) {
new Main();
}
public Main() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new BorderLayout());
DefaultTableModel model = new DefaultTableModel();
model.addColumn("Column 1");
model.addColumn("Column 2");
model.addColumn("Column 3");
model.addColumn("Column 4");
model.setRowCount(100);
JTable table = new JTable(model);
add(new JScrollPane(table));
JToggleButton toggle = new JToggleButton("Toggle");
toggle.addActionListener(new ActionListener() {
private TableColumn column;
@Override
public void actionPerformed(ActionEvent e) {
TableColumnModel columnModel = table.getColumnModel();
if (toggle.isSelected()) {
column = columnModel.getColumn(0);
table.getColumnModel().removeColumn(column);
} else if (column != null) {
columnModel.addColumn(column);
columnModel.moveColumn(columnModel.getColumnCount() - 1, 0);
}
}
});
add(toggle, BorderLayout.SOUTH);
}
}
}
实际上,我花了一些时间制作了一个定制的
TableModel
,它提供了隐藏和显示列的功能,基本上将此功能包装在一个很好的可重用包中考虑提供一个演示您的问题的示例。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应通常当我在过去做过这种事情时,我只需抓取一个对TableColumn
的引用,并将其从ColumnModel
中删除,然后在needed@MadProgrammer你能给我举个例子吗?我正在处理一个大型swing项目,因此我无法在其中发布任何代码。我正在处理一个大型swing项目,因此我无法在其中发布任何代码。
-没有要求您提供整个项目。你所需要做的就是发布一个你想要完成的演示。也就是说,使用JTable创建JFrame。然后创建一个“删除列”按钮和一个“恢复列”按钮。整个代码大约是20-30行代码。了解如何在提问时简化问题。@camickr:提前谢谢。我可以将此用于DefaultTableModel中的表格吗?我可以用JButton代替JToogleButton吗?我这样做了,但有一个例外。线程“AWT-EventQueue-0”java.lang.IllegalArgumentException中的异常:对象在javax.swing.table.DefaultTableColumnModel.addColumn(DefaultTableColumnModel.java:117)处为null,请考虑提供一个示例来说明您的问题。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将导致更少的混乱和更好的响应private void inactiveButtonActionPerformed(java.awt.event.ActionEvent evt){new Runnable(){Override public void run(){//数据库调用者SwingUtilities.invokeLater(new Runnable(){//将数据从数据库加载到表TableColumn列;TableColumnModel=pTable.getColumnModel());重写public void run(){if(inactiveButton.isSelected()){column=model.getColumn(0);expTable.getColumnModel().removeColumn(column);}else{model.addColumn(column);model.moveColumn(model.getColumnCount()-1,0);}}}}}}}}}请提取此内容。