Java 突出显示指定的行JTable

Java 突出显示指定的行JTable,java,swing,jtable,Java,Swing,Jtable,我知道以前也有类似问题的主题,但即使有了它,我也无法解决我的问题 所以问题是,当我向JTable添加一个新的空行时,我想用灰色突出显示它。所以它适用于第一行,但当我尝试添加第二行时,第二行将是白色的 我试图消除错误,但没有成功,我没有发现我的错误 下面是突出显示一行的类: class GrayWhiteRenderer extends DefaultTableCellRenderer { private int rowToColored; GrayWhiteRenderer(

我知道以前也有类似问题的主题,但即使有了它,我也无法解决我的问题

所以问题是,当我向JTable添加一个新的空行时,我想用灰色突出显示它。所以它适用于第一行,但当我尝试添加第二行时,第二行将是白色的

我试图消除错误,但没有成功,我没有发现我的错误

下面是突出显示一行的类:

class GrayWhiteRenderer extends DefaultTableCellRenderer {

    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
        Color color = UIManager.getColor ( "table.row" );
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (UIManager.getColor ( "table.row" )==Color.GRAY) {
                c.setBackground(Color.GRAY.brighter());
            }
            else if(row == rowToColored) {
                c.setBackground(Color.GRAY.brighter());
            } else {
                c.setBackground(Color.WHITE);
            }
        return c;
    }
}
我将所有新行的索引存储在
行的开头添加到
(例如:
[19,20,21,-1,-1,…]
-1是要知道如果我必须突出显示更多内容,我何时必须停止查看):

这里有一个类来测试它:

package Graphic;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

class Test implements Runnable, ActionListener {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Test());
    }

    JTable table;

    @Override
    public void run() {
        JFrame frame = new JFrame("Custom Cell Renderer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        table = new JTable(new DefaultTableModel(0, 2) {
            @Override
            public Class<?> getColumnClass(int c) {
                return Object.class;
            }
        });

        class GrayWhiteRenderer extends DefaultTableCellRenderer {
            private int rowToColored;
            GrayWhiteRenderer(int rowToColored) {
                this.rowToColored = rowToColored;
            }
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (UIManager.getColor ( "table.row" )==Color.GRAY) {
                    c.setBackground(Color.GRAY.brighter());
                }
                else if(row == rowToColored) {
                    c.setBackground(Color.GRAY.brighter());
                } else {
                    c.setBackground(Color.WHITE);
                }
                return c;
            }
        }

        table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(table.getRowCount()));
        table.setTableHeader(null);

        JButton btn = new JButton("Add Row");
        btn.addActionListener(this);

        JToolBar bar = new JToolBar();
        bar.setFloatable(false);
        bar.add(btn);

        JPanel content = new JPanel(new BorderLayout());
        content.add(bar, BorderLayout.NORTH);
        content.add(new JScrollPane(table), BorderLayout.CENTER);

        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        int nextRow = table.getRowCount();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        model.addRow(new Object[] { "" + nextRow, "" + nextRow });
        for(int i=0; i<model.getColumnCount(); i++) {
            table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(i));
        }
    }

}
包装图形;
导入javax.swing.*;
导入javax.swing.table.*;
导入java.awt.*;
导入java.awt.event.*;
类测试实现可运行的ActionListener{
公共静态void main(字符串[]args){
调用器(新测试());
}
JTable表;
@凌驾
公开募捐{
JFrame=新的JFrame(“自定义单元渲染器”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
表=新的JTable(新的DefaultTableModel(0,2){
@凌驾
公共类getColumnClass(int c){
返回Object.class;
}
});
类GrayWhiteRenderer扩展了DefaultTableCellRenderer{
私有int rowToColored;
灰白色渲染器(int rowToColored){
this.rowToColored=rowToColored;
}
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
Component c=super.getTableCellRenderComponent(表、值、isSelected、hasFocus、行、列);
if(UIManager.getColor(“table.row”)==Color.GRAY){
c、 挫折背景(颜色。灰色。较亮();
}
else if(行==rowToColored){
c、 挫折背景(颜色。灰色。较亮();
}否则{
c、 挫折地面(颜色:白色);
}
返回c;
}
}
setDefaultRenderer(Object.class,新的GrayWhiteRenderer(table.getRowCount());
table.setTableHeader(空);
JButton btn=新JButton(“添加行”);
btn.addActionListener(此);
JToolBar=新的JToolBar();
可设置浮动条(假);
添加条(btn);
JPanel content=newjpanel(newborderlayout());
内容。添加(条形、边框布局。北);
添加(新的JScrollPane(表),BorderLayout.CENTER);
frame.setContentPane(内容);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
@凌驾
已执行的公共无效行动(行动事件ae){
int nextRow=table.getRowCount();
DefaultTableModel=(DefaultTableModel)table.getModel();
addRow(新对象[]{”“+nextRow,“+nextRow});

对于(inti=0;i所以,我修复了您的示例

@Override
public void actionPerformed(ActionEvent ae) {
    int nextRow = table.getRowCount();
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.addRow(new Object[] {"" + nextRow, "" + nextRow});
    // the correct row is: nextRow. No loop required here.
    table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(nextRow));
}
我还将更正渲染器以提供选择高亮显示

class GrayWhiteRenderer extends DefaultTableCellRenderer {
    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        // As I know there is no value is registered for "table.row" in UIManager
        // so I've skipped the first condition
        if (row == rowToColored) {
            c.setBackground(Color.GRAY.brighter());
        } else {
            // use correct color depended on whether the cell is selected or not!
            c.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
        }
        return c;
    }
}

请提供一个示例,以便我们也可以重现您的问题。您在此处发布的代码没有提示您问题的原因。“我知道以前有类似问题的主题,但即使有了它,我也无法解决我的问题。”列出最有帮助的3项,并解释他们为什么没有帮助。你的报告是典型的做过0项研究但知道这是预期的人。对不起,如果你认为我已经做了研究,我会列出主题。即使我可以解决我的问题,我也会一直想知道我在改进自己方面的错误在哪里“如果你认为……很抱歉”提示:添加@SergiyMedvynskyy(或任何人,
@
很重要)以通知此人新的评论。(我知道你在回复我,但我想我会给你ti[供将来参考]。“然后我会列出主题“完成后请告诉我。@AndrewThompson这里有一些主题:,我认为有必要使用循环。第二部分是感谢您现在向我澄清。@Corentin lifehack:如果您认为我的答案是正确的(复选框保留在我的答案后面),您将获得2个声誉点;)
class GrayWhiteRenderer extends DefaultTableCellRenderer {
    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        // As I know there is no value is registered for "table.row" in UIManager
        // so I've skipped the first condition
        if (row == rowToColored) {
            c.setBackground(Color.GRAY.brighter());
        } else {
            // use correct color depended on whether the cell is selected or not!
            c.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
        }
        return c;
    }
}