Java 无法获取隐藏的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(

我使用带有两个按钮(活动和非活动按钮)的JTable。单击非活动按钮时,隐藏表的第一列。我还尝试在单击活动按钮时显示第一列。但问题是,当我点击活动按钮时,我无法显示具有首选大小的第一列

这是隐藏第一列的代码

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);}}}}}}}}}请提取此内容。