以编程方式 select JTable 中的多个单元格
Programmatically select multiple cells in a JTable
我有一个显示 SQL-结果的动态 JTable。我正在实现一个搜索功能和 select 所有包含搜索值的单元格。
我正在使用 JTable.changeSelection(row,col,true,false)。在 JTable 中,我实现了一个函数,该函数 returns 包含找到的元素的行和列的对象的 ArrayList。
只要有最大值,这就可以正常工作。 5 个搜索结果,此后 select 是随机的。这是我的代码:
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 个时会这样:
现在我的模式是'8',即使没有8也有很多出现
我已经调试以验证准备数组的搜索功能是否正常工作。我的印象是 JTable.changeSelection-函数变得一团糟。但是到目前为止我还没有找到解决方案。
我认为 select heses 单元格是个好主意,因为我的 JdbcTable 能够转置 selected 行,因此这两个函数会协调一致。
有什么想法吗?
非常感谢
带有 cellSelectionEnabled 的 JTable,获取行 selected 和列 selected 的交集。例如:如果您 select 单元格 (r1, c1) 和 (r2, c2) - JTable selects (r1,c1), (r1, c2), (r2, c1) and (r2 , c2).
重写 JTable 中的 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();
}
}
我有一个显示 SQL-结果的动态 JTable。我正在实现一个搜索功能和 select 所有包含搜索值的单元格。 我正在使用 JTable.changeSelection(row,col,true,false)。在 JTable 中,我实现了一个函数,该函数 returns 包含找到的元素的行和列的对象的 ArrayList。 只要有最大值,这就可以正常工作。 5 个搜索结果,此后 select 是随机的。这是我的代码:
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 个时会这样:
现在我的模式是'8',即使没有8也有很多出现
我已经调试以验证准备数组的搜索功能是否正常工作。我的印象是 JTable.changeSelection-函数变得一团糟。但是到目前为止我还没有找到解决方案。 我认为 select heses 单元格是个好主意,因为我的 JdbcTable 能够转置 selected 行,因此这两个函数会协调一致。 有什么想法吗? 非常感谢
带有 cellSelectionEnabled 的 JTable,获取行 selected 和列 selected 的交集。例如:如果您 select 单元格 (r1, c1) 和 (r2, c2) - JTable selects (r1,c1), (r1, c2), (r2, c1) and (r2 , c2).
重写 JTable 中的 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();
}
}