过滤器后的渲染器,行不再突出显示
Renderer after a filter, rows no longer highlighted
我的方法中有以下渲染器和工具提示
tableR = new JTable(modelR)
{
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
Font myFont = new Font("Arial",Font.PLAIN,10);
Font myFont1 = new Font("Arial", Font.BOLD,10);
if (!isRowSelected(row)) {
if (tableR.getColumnCount() >= 0) {
String type = (String) getModel().getValueAt(row, 11);
c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
c.setFont("0.0".equals(type) ? myFont1: myFont);
}
}
return c;
}
@Override
public String getToolTipText(MouseEvent e) {
String tip = null;
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);
int realColumnIndex = convertColumnIndexToModel(colIndex);
if (realColumnIndex != 20) { //Sport column
tip = " " + getValueAt(rowIndex, colIndex);
//tip = super.getToolTipText(e);
}
return tip;
}
};
每 10 秒刷新一次该方法后应用。
我在 table 上也有一个过滤器侦听器方法,它采用以下形式:
private void filter2method() {
filterR.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
newFilter();
}
@Override
public void removeUpdate(DocumentEvent e) {
newFilter();
}
@Override
public void changedUpdate(DocumentEvent e) {
newFilter();
}
private void newFilter() {
RowFilter <DefaultTableModel, Object>rf =null;
try {
rf = RowFilter.regexFilter(filterR.getText(),2);
} catch (java.util.regex.PatternSyntaxException e) {
return;
}
sorter.setRowFilter(rf);
} }
);
}
然而,在过滤我的 table 后,渲染器不再以红色突出显示正确的行..即那些 0.0
我该如何处理?我是否需要删除渲染器然后重新应用它?
我是否需要将我的渲染器方法合并到过滤器方法中..帮助赞赏。
渲染器报告 view-indices,而不是 model-indices。您正在使用 view-index 在语句 String type = (String) getModel().getValueAt(row, 11);
中索引模型
设置颜色的 if-statement 应为:
int rowModelId = convertRowIndexToModel( row );
if (!isRowSelected(row)) {
if (tableR.getColumnCount() >= 0) {
String type = (String) getModel().getValueAt(rowModelId , 11);
c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
c.setFont("0.0".equals(type) ? myFont1: myFont);
}
}
您也可以使用 JTable.getValueAt
编写它来获取单元格值(此方法需要 view-indexes)以避免必须使用 convertRowIndexToModel
方法,如下所示:
if (!isRowSelected(row)) {
if (tableR.getColumnCount() >= 0) {
String type = (String) getValueAt(row, 11);
c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
c.setFont("0.0".equals(type) ? myFont1: myFont);
}
}
我的方法中有以下渲染器和工具提示
tableR = new JTable(modelR)
{
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
Font myFont = new Font("Arial",Font.PLAIN,10);
Font myFont1 = new Font("Arial", Font.BOLD,10);
if (!isRowSelected(row)) {
if (tableR.getColumnCount() >= 0) {
String type = (String) getModel().getValueAt(row, 11);
c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
c.setFont("0.0".equals(type) ? myFont1: myFont);
}
}
return c;
}
@Override
public String getToolTipText(MouseEvent e) {
String tip = null;
java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);
int realColumnIndex = convertColumnIndexToModel(colIndex);
if (realColumnIndex != 20) { //Sport column
tip = " " + getValueAt(rowIndex, colIndex);
//tip = super.getToolTipText(e);
}
return tip;
}
};
每 10 秒刷新一次该方法后应用。
我在 table 上也有一个过滤器侦听器方法,它采用以下形式:
private void filter2method() {
filterR.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
newFilter();
}
@Override
public void removeUpdate(DocumentEvent e) {
newFilter();
}
@Override
public void changedUpdate(DocumentEvent e) {
newFilter();
}
private void newFilter() {
RowFilter <DefaultTableModel, Object>rf =null;
try {
rf = RowFilter.regexFilter(filterR.getText(),2);
} catch (java.util.regex.PatternSyntaxException e) {
return;
}
sorter.setRowFilter(rf);
} }
);
}
然而,在过滤我的 table 后,渲染器不再以红色突出显示正确的行..即那些 0.0
我该如何处理?我是否需要删除渲染器然后重新应用它? 我是否需要将我的渲染器方法合并到过滤器方法中..帮助赞赏。
渲染器报告 view-indices,而不是 model-indices。您正在使用 view-index 在语句 String type = (String) getModel().getValueAt(row, 11);
设置颜色的 if-statement 应为:
int rowModelId = convertRowIndexToModel( row );
if (!isRowSelected(row)) {
if (tableR.getColumnCount() >= 0) {
String type = (String) getModel().getValueAt(rowModelId , 11);
c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
c.setFont("0.0".equals(type) ? myFont1: myFont);
}
}
您也可以使用 JTable.getValueAt
编写它来获取单元格值(此方法需要 view-indexes)以避免必须使用 convertRowIndexToModel
方法,如下所示:
if (!isRowSelected(row)) {
if (tableR.getColumnCount() >= 0) {
String type = (String) getValueAt(row, 11);
c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
c.setFont("0.0".equals(type) ? myFont1: myFont);
}
}