【问题标题】:Java rowAtPoint() does not return a proper valueJava rowAtPoint() 没有返回正确的值
【发布时间】:2012-02-12 12:43:37
【问题描述】:

我正在制作一个 java 项目,我正在使用 JTable。 我想做的事情是将popupmenu 链接到jtablepopupmenu 有四个不同的items。一些items 需要知道在jtable 中选择了row。问题出在selectRow -function 中。我无法获得返回正确row 的函数。我单击带有right mouse buttonjtable,然后在我单击的同一列中弹出popupmenu。但是当我使用addSelectedRowremoveSelectedRow -functions(在带有标签“addSelected”或“deleteSelected”的menuItem 中)并且没有选择任何row(s) 时,我使用selectRow -function 来查找row我点击right mousebutton。似乎rowAtPoint(Point p) 不能只找到正确的行。它返回 0 或 -1。我已经为这个问题苦苦挣扎了将近一个星期,所以请拉皮条我的代码:D 我希望代码足够干净:D

http://painkiller.comlu.com/images/1.jpg

这是一个问题的屏幕截图。 JTable 总是至少有一排。我单击任意行(在这种情况下是第二个row)。 Row 未按目的选择。现在,如果我按“Lisää valittu” - 这意味着“Add selected”,函数selectRow() 将被调用。

/**位置

jTbl.getLocation(): java.awt.Point[x=0,y=0]
e.getPoints() java.awt.Point[x=4,y=8]
SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), jTbl) java.awt.Point[x=350,y=31]

首先我尝试了e.getPoint() * e.getPoints() -> java.awt.Point[x=4,y=8]rowAtPoint() 返回的行索引号:0

然后我尝试了SwingUtilities.convertPoint() * SwingUtilities.convertPoint(tablePopMenu, e.getPoint(), jTbl); -> java.awt.Point[x=28,y=10]rowAtPoint() 返回的行索引号:2

所以它似乎可以工作,但有时函数会抛出 -1 或 0。(需要检查出那个错误)但大多数情况下效果很好。

private void TableMousePressed(java.awt.event.MouseEvent evt) {
        try
        {
            /*
             * The popupmenu content (items) are standart for all tables
             * The label of popupmenu items are used to select proper 
             * command in select case
             * 1. Add selected-> Add only selected row(s)
             * 2. Add all -> Add all rows
             * 3. Delete selected -> Remove only selected row(s)
             * 4. Delete all-> Remove all row(s)
            */

            javax.swing.JTable temp;    //Temporar jTable alien
            String label = ((javax.swing.JMenuItem)evt.getSource()).getText();   //Switch Case


            temp = (javax.swing.JTable)((JPopupMenu)(evt.getComponent().getParent())).getInvoker();
            switch(label)   //Select rigt method by jMenuItem.getText() method (the label of menu item)            {
                case "Add selected":
                    addSelectedRow(evt, temp);
                    break;
                case "Add all":
                    addAllRows(temp);
                    break;
                case "Delete selected":
                    removeSelectedRow(evt, temp);
                    break;
                case "Delete all":
                    removeAllRows(temp);
                    break;
            }            
        }
        catch(Exception ex){ex.printStackTrace();}
    }

    /**
     * @param e - MouseEvent
     * @param jTbl - JTable which will be used
     */
    private void addSelectedRow(java.awt.event.MouseEvent e, javax.swing.JTable jTbl){
        if(jTbl.getSelectedRow() == -1){ //If no row(s) is selected 
            selectRow(e, jTbl); //select row
        }  
        int cellCount = jTbl.getModel().getColumnCount(); //amount of columns to apply
        int rows[] = jTbl.getSelectedRows(); //amount of rows to apply
        cellCollection = new Object[jTbl.getModel().getColumnCount()]; //Object which contains row and cells. will be added to a jTable as a new row

        for(int row = 0; row < rows.length; row++){ //Creates new row by excisting data
            for(int cell = 0; cell < cellCount; cell++){
                cellCollection[cell] = jTbl.getModel().getValueAt(rows[row], cell);
            }
            ((DefaultTableModel)jTbl.getModel()).addRow(cellCollection); //Adds a new row with data
        }         
    }

    /**
     * @param jTbl - JTable which will be used
     */
    private void addAllRows(javax.swing.JTable jTbl){
        int rowCount = jTbl.getModel().getRowCount(); //Amount of adding rows
        int cellCount = jTbl.getModel().getColumnCount(); //Amount of adding colums
        cellCollection = new Object[jTbl.getModel().getColumnCount()]; //New object which contains a row with columns filled with excisting data in a for-loop

        for(int row = 0; row < rowCount; row++){ 
            for(int cell = 0; cell < cellCount; cell++){
                cellCollection[cell] = jTbl.getModel().getValueAt(row, cell);
            }
            ((DefaultTableModel)jTbl.getModel()).addRow(cellCollection);
        }     
    }

    /**
     * @param e - MouseEvent
     * @param jTbl - JTable which will be used
     */
    private void removeSelectedRow(java.awt.event.MouseEvent e, javax.swing.JTable jTbl){
        if(jTbl.getSelectedRow() == -1){ //If no row(s) is selected
            selectRow(e, jTbl); //selects a row
        }
        int[] rows = jTbl.getSelectedRows(); //Get selected row(s)
        for(int i = rows.length - 1; i >= 0; i--)
            ((DefaultTableModel)jTbl.getModel()).removeRow(rows[i]); //Removes the rows
        getTableToLife(jTbl); //Adds a new empty row if jtable has no rows after removing
    }

    /**
     * @param jTbl - JTable which will be used
     */
    private void removeAllRows(javax.swing.JTable jTbl){
        int rowCount = jTbl.getModel().getRowCount(); //Amount of removing rows
        for(int row = rowCount-1; row >=0; row--){ 
            ((DefaultTableModel)jTbl.getModel()).removeRow(row); //Remove rows
        }
        getTableToLife(jTbl);//Adds a new empty row if jtable has no rows after removing        
    }

    /**
     * @param jTbl - JTable which will be saved
     */
    private void getTableToLife(javax.swing.JTable jTbl){
        if(jTbl.getModel().getRowCount() == 0){ //If jtable has no rows
            int cellCount = jTbl.getModel().getColumnCount(); //How many cells will be added
            cellCollection = new Object[cellCount];
            for(int cell = 0; cell < cellCount; cell++){
                cellCollection[cell] = null; //No new data is required                }   
            ((DefaultTableModel)jTbl.getModel()).addRow(cellCollection); //Adding a new empty row
        }
    }

    /**
     * @param e - Mouse event
     */
    private void selectRow(java.awt.event.MouseEvent e, javax.swing.JTable jTbl)
    {

    //      This is the main problem at the moment

    //    System.out.print("\r " + jTbl.rowAtPoint(e.getPoint()));
    //    ListSelectionModel selector = jTbl.getSelectionModel();
    //    selector.removeSelectionInterval(0, jTbl.getHeight()); //I though it he could help, but no effect (row [0] seems to be selected
    //    int p = jTbl.rowAtPoint(e.getPoint()); //or this function seems to be uncapable to find right row i clicked on jtable
    //    selector.setSelectionInterval(p, p); //returns 0 or -1. reason is unknown

    //    New solution
    ListSelectionModel selector = jTbl.getSelectionModel();
    Point newP = SwingUtilities.convertPoint(tablePopMenu, e.getPoint(), jTbl);


    int p = jTbl.rowAtPoint(newP);
    System.out.print("\rRow number: " + (p));
    if(p <=0)
        selector.setSelectionInterval(p, p);
    else
        selector.setSelectionInterval(p-1, p-1);
    }

感谢你们拯救了我的一天!

【问题讨论】:

    标签: java swing jtable jpopupmenu


    【解决方案1】:

    我不完全确定,但可能是 MouseEvent 的 getPoint() 方法在弹出菜单的坐标空间中返回一个点。

    JTable 的 rowAtPoint(p) 期望的是表格坐标空间内的一个点。

    您可以使用 SwingUtilities.convertPoint() 来转换坐标。

    【讨论】:

      【解决方案2】:

      这段代码应该显示真正的问题,取决于这段代码被剪断之前/之后的代码,或者是否使用过

      1) used SelectionModel type

      2) Sorting and Filtering,了解 convertXxxIndexToXxx 方法

      3) 使用SSCCE 编辑您的问题,用于example

      【讨论】:

        【解决方案3】:

        作为替代方案,使用自定义TableCellEditor,如here 所示。当编辑器结束时,您将能够在模型的 setValueAt() 实现中明确确定受影响的行。

        【讨论】:

          猜你喜欢
          • 2014-03-12
          • 1970-01-01
          • 2014-11-26
          • 2017-11-24
          • 1970-01-01
          • 2019-03-21
          • 1970-01-01
          • 2014-07-15
          相关资源
          最近更新 更多