Java 使用JTextfield文本重复搜索JTable
下面的代码将从textfield中获取文本并在JTable中搜索它。它只显示文本的第一次出现。我也需要连续发生。所以,请指导我如何做到这一点。提前谢谢Java 使用JTextfield文本重复搜索JTable,java,swing,Java,Swing,下面的代码将从textfield中获取文本并在JTable中搜索它。它只显示文本的第一次出现。我也需要连续发生。所以,请指导我如何做到这一点。提前谢谢 private void search8() { String target8 = sear8.getText(); for(int row = 0; row < table8.getRowCount(); row++) for(int col = 0; col < table8.getColumnCo
private void search8()
{
String target8 = sear8.getText();
for(int row = 0; row < table8.getRowCount(); row++)
for(int col = 0; col < table8.getColumnCount(); col++)
{
String next8 = (String)table8.getValueAt(row, col);
if(next8.equals(target8))
{
showSearchResults(row, col);
return;
}
}
}
找到target8的第一个匹配项后立即返回
最好建立一个匹配字符串的列表,并将其传递给您的方法
showSearchResults
在找到target8的第一个匹配项后立即返回
最好建立一个匹配字符串的列表并传递给您的方法
showSearchResults
有两种方法可以实现这一点:
- 正如Reimeus所建议的,执行单个解析以查找特定搜索关键字的所有出现,并将其位置存储在列表中。然后调用您的
并遍历列表showSearchResults()
- 第二种选择是将上次扫描的位置存储在某个地方。然后,当用户按下“下一步”时,从该位置开始搜索,而不是再次从(0,0)开始搜索
private void search8(){
ArrayList resultList=新建ArrayList();
字符串target8=sear8.getText();
对于(int row=0;row
实现这一点有两种方法:
- 正如Reimeus所建议的,执行单个解析以查找特定搜索关键字的所有出现,并将其位置存储在列表中。然后调用您的
并遍历列表showSearchResults()
- 第二种选择是将上次扫描的位置存储在某个地方。然后,当用户按下“下一步”时,从该位置开始搜索,而不是再次从(0,0)开始搜索
private void search8(){
ArrayList resultList=新建ArrayList();
字符串target8=sear8.getText();
对于(int row=0;row
否则
private void显示搜索结果(列出结果)
{
对于(p点:结果)
{
int col=p.x;
int row=p.y;
CustomRenderer=(CustomRenderer)表8.getCellRenderer(行、列);
setTargetCell(行、列);
矩形r8=表8.getCellRect(行、列、假);
表8.scrollRectToVisible(r8);
}
表8.重新喷漆();
}
否则
private void显示搜索结果(列出结果)
{
对于(p点:结果)
{
int col=p.x;
int row=p.y;
CustomRenderer=(CustomRenderer)表8.getCellRenderer(行、列);
setTargetCell(行、列);
矩形r8=表8.getCellRect(行、列、假);
表8.scrollRectToVisible(r8);
}
表8.重新喷漆();
}
你说的“连续发生”是什么意思?您希望一次只突出显示一个实例,并要求用户选择“下一步”,还是希望同时显示所有实例?@MadProgrammer user必须选择next@MadProgrammer这两个对我来说都没问题,先生。我试着用数组存储值,先生。我已经更新了问题中的代码。但我得到了数组索引越界异常。我会犯什么错误,先生?@Sujay感谢你清理了格式混乱:-)To OP:这个网站在设置缩进的标签(或者更糟的是:标签和空格的混合)的格式代码时有问题,所以请不要使用标签。你说“连续发生”是什么意思?您希望一次只突出显示一个实例,并要求用户选择“下一步”,还是希望同时显示所有实例?@MadProgrammer user必须选择next@MadProgrammer这两个对我来说都没问题,先生。我试着用数组存储值,先生。我已经更新了问题中的代码。但我得到了数组索引越界异常。我会犯什么错误,先生?@Sujay谢谢你清理了格式混乱:-)To OP:这个网站在设置包含制表符(或者更糟的是:制表符和空格的混合)的缩进代码格式方面有问题,所以请不要这样做
private void showSearchResults(int row, int col)
{
CustomRenderer renderer = (CustomRenderer)table8.getCellRenderer(row, col);
renderer.setTargetCell(row, col);
Rectangle r8 = table8.getCellRect(row, col, false);
table8.scrollRectToVisible(r8);
table8.repaint();
}
class CustomRenderer implements TableCellRenderer
{
public CustomRenderer()
{
label = new JLabel();
label.setHorizontalAlignment(JLabel.CENTER);
label.setOpaque(true);
targetRow = -1;
targetCol = -1;
}
public Component getTableCellRendererComponent(JTable table,
Object value,boolean isSelected,boolean hasFocus,int row, int column)
{
if(isSelected)
{
label.setBackground(table.getSelectionBackground());
label.setForeground(table.getSelectionForeground());
}
else
{
label.setBackground(table.getBackground());
label.setForeground(table.getForeground());
}
if(row == targetRow && column == targetCol)
{
label.setBackground(new Color(176,196,222));
//label.setBorder(BorderFactory.createLineBorder(Color.red));
label.setFont(table.getFont().deriveFont(Font.BOLD));
}
else
{
label.setBorder(null);
label.setFont(table.getFont());
}
label.setText((String)value);
return label;
}
public void setTargetCell(int row, int col)
{
targetRow = row;
targetCol = col;
}
}
private void search8() {
ArrayList<String> resultList = new ArrayList<String>();
String target8 = sear8.getText();
for (int row = 0; row < table8.getRowCount(); row++) {
for (int col = 0; col < table8.getColumnCount(); col++) {
String next8 = (String) table8.getValueAt(row, col);
if (next8.contains(target8)) {
resultList.add(row + "," + col);
}
}
}
System.out.println(sarr8.length);
String[] tokens;
for (String result : resultList) {
try {
tokens = result.split("[,]");
showSearchResults(tokens[0], tokens[1]);
} finally {
tokens = null;
}
}
/**
* Your remaining part
*/
}
// I'd, personally, make this protected as you may wish to change the how the search
// is performed in the future.
protected void search8() {
// You've assumed that there are only ever 40 elements
// while you've allowed for a variable number of search positions
// You would need (at least) (rowCount * colCount) * 2 elements to be
// safe. This is a little ridiculous considering that there might
// only be 1 reuslt in the table
// int[] sarr8 = new int[40]; <-- Don't really want to do this
// Instead, we should use a dynamic array instead
// The ArrayList is a Collection implementation backed by an array
// but it has the means to grow (and shrink) to meet the capacity requirements
List<Point> slist8 = new ArrayList<Point>(25); // <-- you could change the initial value as you see fit
int i = 0;
String target8 = sear8.getText();
for (int row = 0; row < table8.getRowCount(); row++) {
for (int col = 0; col < table8.getColumnCount(); col++) {
String next8 = (String) table8.getValueAt(row, col);
if (next8.contains(target8)) {
// Okay, this kinda cheating, but we want to store col/row or x/y
// cell coordinates. You could make your own class "Cell" class,
// but for what we want, this is exactly the same
Point cell = new Point(col. row);
//sarr8[i] = row;
//sarr8[i + 1] = col;
//i = i + 2;
slist8.add(cell);
}
}
}
//System.out.println(sarr8.length);
System.out.println(slist8.size());
//for (int j = 0; j < sarr8.length; j += 2) {
// showSearchResults(sarr8[j], sarr8[j + 1]);
// return;
//}
// Now, personally, I'd pass in the whole result set to the "showSearchResults"
// method, because, IMHO, that's the methods domain of responsibility, ours was
// to simply find the results.
showSearchResults(slist8);
// At this point, the showSearchResults method can determine how it wants to display
// the search results
}
for (Point p : slist8) {
showSearchResults(p.x, p.y);
}
private void showSearchResults(List<Point> results)
{
for (Point p : results)
{
int col = p.x;
int row = p.y;
CustomRenderer renderer = (CustomRenderer)table8.getCellRenderer(row, col);
renderer.setTargetCell(row, col);
Rectangle r8 = table8.getCellRect(row, col, false);
table8.scrollRectToVisible(r8);
}
table8.repaint();
}