【发布时间】:2012-07-27 13:20:31
【问题描述】:
以下代码将从文本字段中获取文本并在 JTable 中搜索它。它仅显示文本的第一次出现。我也需要连续发生。所以,请指导我如何实现这一目标。提前致谢。
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;
}
}
}
更新:
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;
}
}
【问题讨论】:
-
“连续发生”是什么意思?您是希望一次仅突出显示一个实例并要求用户选择“下一个”,还是要同时显示所有实例?
-
@MadProgrammer 用户必须选择下一个
-
@MadProgrammer 对我来说都可以,先生。
-
@MadProgrammer 我尝试使用数组存储值,先生。我已经更新了问题中的代码。但是我得到了数组索引超出范围的异常。先生,我犯了什么错误?
-
@Sujay 感谢您清理格式混乱 :-) 致 OP:此站点在格式代码中存在用于缩进的包含制表符(或更糟:制表符和空格的混合)的问题,所以请不要根本不使用标签。