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