在Jtable中添加JCombobox并在Swing java中获取该行和列

时间:2014-05-02 06:16:46

标签: java swing jtable jcombobox tablecelleditor

我有一个Jtable,其中我添加了JComobox。

TableColumn sportColumn = jTable1.getColumnModel().getColumn(2);
        comboBox = new JComboBox();
        comboBox.addItem("Snowboarding");
        comboBox.addItem("Rowing");
        comboBox.addItem("Chasing toddlers");
        comboBox.addItem("Speed reading");
        comboBox.addItem("Teaching high school");
        comboBox.addItem("None");
        sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

我添加了一个像这样的jtable鼠标事件。

private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {                                     
        // TODO add your handling code here:
        try {
            int row = jTable1.rowAtPoint(evt.getPoint());
            int col = jTable1.columnAtPoint(evt.getPoint());

            System.out.println("Row" + row + "Column" + col);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

我正在排列行和列。enter image description here

但是当我点击我添加Jcombobox的单元格时,它没有给出该行和列的放置。仍然我在组合框点击事件中调用了表格的clickevent,但是它给了所有时间第0行甚至第0列这里的屏幕截图。

enter image description here

所以我怎么解决它所以我可以有那个行和列?

3 个答案:

答案 0 :(得分:5)

在我看来,你有三个基本选择......

你可以......

CellEditorListener附加到DefaultCellEditor并监控editingStopped个活动......

editor.addCellEditorListener(new CellEditorListener() {
    @Override
    public void editingStopped(ChangeEvent e) {
        System.out.println("Editing stopped");
        TableCellEditor editor = (TableCellEditor) e.getSource();
        Object value = editor.getCellEditorValue();
        System.out.println("Selected value = " + value);
    }

    @Override
    public void editingCanceled(ChangeEvent e) {
    }
});

问题在于,实际上无法确定已编辑的单元格。即使引用JTable,当您收到此事件时,该表也不再处于编辑模式...所以您只知道编辑器的价值......

你可以......

TableModelListener附加到TableModel ...

model.addTableModelListener(new TableModelListener() {
    @Override
    public void tableChanged(TableModelEvent e) {
        int type = e.getType();
        switch (type) {
            case TableModelEvent.UPDATE:
                if (e.getFirstRow() - e.getLastRow() == 0) {
                    TableModel model = (TableModel) e.getSource();
                    int row = e.getFirstRow();
                    int col = e.getColumn();
                    System.out.println("Update " + row + "x" + col + " = " + model.getValueAt(row, col));
                }
                break;
        }
    }
});

这会让你知道一个单元格的价值何时发生了变化(还有很多其他的东西,但这是我们感兴趣的东西),它不会告诉你什么,这就是它改变的原因。

这种方法很好,因为它提供了您需要知道的所有信息,以便找到值和单元格。

你可以......

只需覆盖TableModel的{​​{1}}方法,并提供您自己的某种通知......

虽然这有点复制setValueAt的功能,但您可以设计事件信息,以便它提供更多相关信息,因为TableModelListener涵盖了很多用户案例......

示例

下面是一个TableRenderDemo的示例,并进行了修改以演示前两个概念

TableModelEvent

答案 1 :(得分:0)

使用以下代码,您可以获取所选行和列的值。 enter image description here

table.addMouseListener(new MouseAdapter() 
      {
        @Override
        public void mouseClicked(MouseEvent e) 
        {
            try {
                int rowss = table.rowAtPoint(e.getPoint());
                System.out.println("rowss" + rowss);
                printDebugData(table);
            } catch (ParseException ex) {
                Logger.getLogger(ShowEmployee.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        private void printDebugData(JTable jTable1) throws ParseException
        {
              String selectedData = null;

            int numRows = jTable1.getRowCount();
            int numCols = jTable1.getColumnCount();
            int[] selectedRow = jTable1.getSelectedRows();
            int[] selectedColumns = jTable1.getSelectedColumns();
            javax.swing.table.TableModel model = jTable1.getModel();
            for (int i = 0; i < selectedRow.length; i++)
            {
                for (int j = 0; j < selectedColumns.length; j++) 
                {
                    selectedData = (String) jTable1.getValueAt(selectedRow[i], selectedColumns[j]);
                }
                System.out.println("Selected: " + selectedData);
            }
        }
        });

  }

使用你的jtbale检查mouselistner。

更新: 在printdebugdata()调用之前添加这两行。

  int rowss = table.rowAtPoint(e.getPoint());
  System.out.println("rowss" + rowss);

我得到行号检查我的输出。

输出:

rowss0
Selected: Smith
rowss0
Selected: Smith
rowss1
Selected: Snowboarding
rowss1
Selected: Rowing
rowss1
Selected: Rowing
rowss1
Selected: Rowing
rowss2
Selected: Snowboarding
rowss2
Selected: Snowboarding
rowss2
Selected: Snowboarding
rowss2
Selected: Snowboarding

谢谢..

答案 2 :(得分:0)

嗯它的小但对我来说很奇怪但是我确实解决了它,但我不认为这是正确的ansewer但我解决了它。我打了电话。组合按钮操作执行事件,并在其中调用鼠标单击jtable。用null而不是Event。看看吧。

 comboBox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                jTable1MouseClicked(null);
            }
        });


 private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {                                     
        // TODO add your handling code here:
        try {
            //evt.getPoint();
            System.out.println("row" + jTable1.getSelectedRow());
            System.out.println("col" + jTable1.getSelectedColumn());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }                                    

可能是不正确的方式,但我解决了这个问题。它的工作。

最佳解决方案是

jTable1.getModel().addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                System.out.println("Changed Column"+e.getColumn());
                System.out.println("first row"+e.getFirstRow());
            }
        });

    }