代码之家  ›  专栏  ›  技术社区  ›  Fredy Fischer

以编程方式选择JTable中的多个单元格

  •  0
  • Fredy Fischer  · 技术社区  · 8 年前

    我有一个显示SQL结果的动态JTable。我正在实现一个搜索功能,并选择包含搜索值的所有单元格。 我正在使用JTable。更改选择(行、列、真、假)。在JTable中,我实现了一个函数,该函数返回一个对象的ArrayList,该对象包含找到的元素的行和列。 只要最多有5个搜索结果,它就可以很好地工作,然后它会选择某种随机的结果。这是我的代码:

    private void searchTable() {
        String pattern = JOptionPane.showInputDialog(scrollpane, "Pattern", "Find Text in Table", JOptionPane.QUESTION_MESSAGE);
    
        if (pattern != null) {
    
            Thread t = new Thread(new Runnable() {
                public void run() {
                    busyCursor();
                    ArrayList<TableFindResult> tfr = dt.search(pattern);
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            tableView.setColumnSelectionAllowed(true);
                            tableView.setRowSelectionAllowed(true);
    
                            tableView.clearSelection();
                            int a = 1;
                            Iterator iter = tfr.iterator();
                            while (iter.hasNext()) {
                                TableFindResult t = (TableFindResult) iter.next();                                
                                tableView.changeSelection(t.getRow(), t.getCol(), true, false);
    
                            }
                            defaultCursor();
                        }
                    });
                }
            });
            t.start();
    
        } else {
            tableView.clearSelection();
        }
    
    }
    

    以下是少于5个结果时的情况:

    enter image description here

    现在我的模式是“8”,即使没有8,也会有很多外观 enter image description here

    我已经进行了调试,以验证准备数组的searchfunction是否正常工作。我觉得这是JTable。changeSelection函数,这会弄得一团糟。但到目前为止,我还没有找到解决方案。 我认为选择heses单元格是一个好主意,因为我的JdbcTable能够转置选定的行,以便这两个函数能够协调。 有什么想法吗? 非常感谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   Dakshinamurthy Karra    8 年前

    JTable with cellSelectionEnabled,获取选定行和选定列的交点。例如:如果选择单元格(r1,c1)和(r2,c2)-JTable选择(r1,c1)、(r1,c2)、(r2,c1)和(r2,c2)。

    推翻 isCellSelected 以获得您的预期行为。

    在下面添加一个小示例:

    package tableselection;
    
    import java.awt.Point;
    import java.awt.event.MouseEvent;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    
    public class TableSelection extends JFrame {
        private static final long serialVersionUID = 1L;
        String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };
        Object[][] data = { { "Kathy", "Smith", "Snowboarding", Integer.valueOf(5), Boolean.valueOf(false) },
                { "John", "Doe", "Rowing", Integer.valueOf(3), Boolean.valueOf(true) },
                { "Sue", "Black", "Knitting", Integer.valueOf(2), Boolean.valueOf(false) },
                { "Jane", "White", "Speed reading", Integer.valueOf(20), Boolean.valueOf(true) },
                { "Joe", "Brown", "Pool", Integer.valueOf(10), Boolean.valueOf(false) } };
    
        public TableSelection() {
            JPanel main = new JPanel();
            JTable table = new JTable(data, columnNames) {
                private static final long serialVersionUID = 1L;
                List<Point> selected = new ArrayList<Point>();
                @Override protected void processMouseEvent(MouseEvent e) {
                    if(e.getID() != MouseEvent.MOUSE_PRESSED)
                        return;
                    int row = ((JTable)e.getSource()).rowAtPoint(e.getPoint());
                    int col = ((JTable)e.getSource()).columnAtPoint(e.getPoint());
                    if(row >= 0 && col >= 0) {
                        Point p = new Point(row, col);
                        if(selected.contains(p))
                            selected.remove(p);
                        else
                            selected.add(p);
                    }
                    ((JTable)e.getSource()).repaint();
                }
    
                @Override public boolean isCellSelected(int arg0, int arg1) {
                    return selected.contains(new Point(arg0, arg1));
                }
            };
            JScrollPane pane = new JScrollPane(table);
            main.add(pane);
            this.add(main);
    
            this.setSize(800, 600);
            this.setVisible(true);
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new TableSelection();
        }
    
    }