【问题标题】:getSelectedColumn with JTable doesn't work with changing model带有 JTable 的 getSelectedColumn 不适用于更改模型
【发布时间】:2010-12-15 10:08:06
【问题描述】:

我有一个 JTree,当你单击叶子时,它会更改 JTable 模型并显示一个新表(很像电子邮件系统)。当我尝试选择新表模型的列时出现问题,无论如何它总是给出-1。请注意,这对于第一个 JTable 模型非常有效,但是在更改表之后,

System.out.println(table.getSelectedColumn());

总是返回 -1。

编辑:好吧,老实说,我不知道要在此处发布哪个代码 sn-p。

    //constructor
    public TreeSection() {
    super();

    //TREE
    top = new DefaultMutableTreeNode("EMAIL");
    createNodes(top);
    //Create a tree that allows one selection at a time.
    tree = new JTree(top);
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    //Listen for when the selection changes.
    tree.addTreeSelectionListener(this);

    //TABLE
    tableModel = new MyTableModel();
    table = new JTable(tableModel);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setFillsViewportHeight(true);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    selectionModel = table.getSelectionModel();
    selectionModel.addListSelectionListener(this);


    //SCROLL PANE
    treeView = new JScrollPane(tree);
    tableView = new JScrollPane(table);

    //SPLIT PANE
    splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    splitPane.setTopComponent(treeView);
    splitPane.setBottomComponent(tableView);
    splitPane.setDividerLocation(400);
    splitPane.setPreferredSize(new Dimension(200, 700));

    //Add the split pane to this panel.
    panel.add(splitPane,BorderLayout.WEST);
}

/** Required by TreeSelectionListener interface. */
public void valueChanged(TreeSelectionEvent e) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();

    if (node == null) return;

    Object nodeInfo = node.getUserObject();

    if (node.isLeaf()) {
        MailObject mObj = (MailObject)nodeInfo;
        table.removeAll();
        tableModel.setTableData(mObj.tableD);//changes tree model
        table = new JTable(tableModel);

        panel.repaint();
    }
}

public void valueChanged(ListSelectionEvent event) {
    // Get the data model for this table
    //table.changeSelection(table.getSelectedColumn(), table.getSelectedRow(), false, false);
    TableModel model = (TableModel)table.getModel();
    System.out.println(table.getSelectedColumn());
    }

【问题讨论】:

    标签: java swing jtable jtree


    【解决方案1】:

    当没有选择列时,getSelectedColumn 返回 -1。 如果您确定某个列被选中,那么在创建新表时,您可能在旧表上调用 getSelectedColumn?

    sn-p 发布后编辑: 您正在创建一个新的 JTable,它不仅没有设置(例如 FillsViewPortHeight,而且没有选择模型。尝试替换

    table = new JTable(tableModel);
    

    值改变了

    table.setModel(tableModel);
    

    【讨论】:

    • 我在 JTable 变量上调用 getSelectedColumn,当​​ JTree 更改它时,该变量会随着更改的模型不断更新。我个人觉得这是一个听众问题。即使我与听众混在一起,也没有任何改善。
    • 感谢一百万!你解决了我的问题!几乎浪费了 3 个小时。
    【解决方案2】:

    当您更改支持模型时,它会重置选择信息。请记住,新模型甚至可能有不同数量的列,等等。

    您可以做的是在更改模型之前保存选择信息,然后在设置新模型后重新选择正确的列。

    【讨论】:

    • 好的,但即使我在表更改之前不选择任何内容,这仍然会发生。所以在这种情况下,根本没有初始选择,但仍然会出现同样的问题。
    • 那么你是说你更新模型,然后选择一列,然后你仍然得到-1作为选择的列?也许您可以发布一些代码以使情况更清楚,或者列出正在发生的实际操作?
    猜你喜欢
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多