Java JXTable中非常不寻常的单元格高亮显示

Java JXTable中非常不寻常的单元格高亮显示,java,swing,jtable,swingx,jxtable,Java,Swing,Jtable,Swingx,Jxtable,我有一个JXTable设置,可以用特定的颜色绘制选定的单元格。但是,只要选定的单元格位于顶行,它就会显示为表格中的所有单元格都已绘制 有人能帮我理解为什么,以及如何解决这个问题吗 下面是演示此问题的最小工作示例 其他信息:每次调用Paint()时都会重新应用DefaultTableCellRenderer,因为它是我在完整程序中使用的CustomTableCellRenderer的占位符。有趣的是,如果我删除DefaultTableCellRenderer行,我的问题就解决了。为什么会这样?当然

我有一个JXTable设置,可以用特定的颜色绘制选定的单元格。但是,只要选定的单元格位于顶行,它就会显示为表格中的所有单元格都已绘制

有人能帮我理解为什么,以及如何解决这个问题吗

下面是演示此问题的最小工作示例

其他信息:每次调用Paint()时都会重新应用DefaultTableCellRenderer,因为它是我在完整程序中使用的CustomTableCellRenderer的占位符。有趣的是,如果我删除DefaultTableCellRenderer行,我的问题就解决了。为什么会这样?当然,如果未指定渲染器,则仍将使用默认值

import java.awt.Color;
import java.awt.Component;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.ComponentAdapter;
import org.jdesktop.swingx.decorator.HighlightPredicate;

public class MainClass {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        CustomTableModel tableModel = new CustomTableModel();
        JXXTable table = new JXXTable(tableModel);
        JScrollPane scrollPane = new JScrollPane(table);
        SelectionListener listener = new SelectionListener(table);
        table.getSelectionModel().addListSelectionListener(listener);    
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.add(scrollPane);
        frame.setVisible(true);
        frame.pack();
    }
}

class JXXTable extends JXTable {
    public JXXTable(CustomTableModel model){ super(model); }
    public void Paint(){
        this.setDefaultRenderer(Object.class, new DefaultTableCellRenderer());
        this.setHighlighters();
        HighlightPredicate predicate = new HighlightPredicate() {
            public boolean isHighlighted(Component renderer, ComponentAdapter adapter) {
                return adapter.hasFocus();
            }
        };
        this.addHighlighter(new ColorHighlighter(predicate, null, null, new Color(115,164,209), Color.WHITE)); 
    }
}

class SelectionListener implements ListSelectionListener {
    JXXTable table;
    public SelectionListener(JXXTable table) { this.table = table; }
    public void valueChanged(ListSelectionEvent e) { table.Paint(); }
}

class CustomTableModel extends AbstractTableModel {
    ArrayList<Object[]> al;

    public CustomTableModel() {
        al = new ArrayList<Object[]>(); 
        Object[] row = {1,2,3,"A","Collection","of","Random","Strings",9,10}; al.add(row);
        Object[] row2 = {11,12,13,"Another","Collection","Of","Random","Strings",19,20}; al.add(row2);
        Object[] row3 = {11,12,13,"Another","Collection","Of","Random","Strings",19,20}; al.add(row3);
        Object[] row4 = {11,12,13,"It","just","gets","more","random...",19,20}; al.add(row4);
    }

    public int getRowCount() { return al.size(); }
    public int getColumnCount() { return 10; }
    public Object getValueAt(int rowIndex, int columnIndex) { return al.get(rowIndex)[columnIndex]; }
}
导入java.awt.Color;
导入java.awt.Component;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.DefaultTableCellRenderer;
导入org.jdesktop.swingx.JXTable;
导入org.jdesktop.swingx.decorator.ColorHighlighter;
导入org.jdesktop.swingx.decorator.ComponentAdapter;
导入org.jdesktop.swingx.decorator.HighlightPredicate;
公共类主类{
公共静态void main(字符串[]args){
JFrame=新JFrame();
CustomTableModel tableModel=新的CustomTableModel();
JXXTable table=新JXXTable(表格模型);
JScrollPane scrollPane=新的JScrollPane(表);
SelectionListener=新建SelectionListener(表);
table.getSelectionModel().addListSelectionListener(listener);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(滚动窗格);
frame.setVisible(true);
frame.pack();
}
}
类JXXTable扩展了JXTable{
公共JXXTable(CustomTableModel模型){super(model);}
公共空间涂料(){
此.setDefaultRenderer(Object.class,新的DefaultTableCellRenderer());
这个。setHighlighters();
HighlightPredicate谓词=新的HighlightPredicate(){
公共布尔isHighlighted(组件渲染器、组件适配器){
返回adapter.hasFocus();
}
};
this.addHighlighter(新颜色highlighter(谓词,null,null,新颜色(115164209),Color.WHITE));
}
}
类SelectionListener实现ListSelectionListener{
JXX表格;
public SelectionListener(JXXTable表){this.table=table;}
public void valueChanged(ListSelectionEvent e){table.Paint();}
}
类CustomTableModel扩展了AbstractTableModel{
ArrayList al;
公共CustomTableModel(){
al=新的ArrayList();
Object[]row={1,2,3,“A”,“Collection”,“of”,“Random”,“Strings”,9,10};al.add(row);
Object[]row2={11,12,13,“另一个”,“集合”,“Of”,“随机”,“字符串”,19,20};al.add(row2);
Object[]row3={11,12,13,“另一个”,“集合”,“Of”,“随机”,“字符串”,19,20};al.add(row3);
Object[]row4={11,12,13,“It”,“just”,“get”,“more”,“random…”,19,20};al.add(row4);
}
public int getRowCount(){return al.size();}
public int getColumnCount(){return 10;}
公共对象getValueAt(int-rowIndex,int-columnIndex){return al.get(rowIndex)[columnIndex];}
}
我“认为”问题的一部分与每次选择更改时添加另一个荧光灯有关

取而代之的是,只在初始化表时添加高亮……/P> 话虽如此,也没有必要扩展

JXTable
,您并没有真正向类添加任何新功能。相反,您可以创建某种工厂来配置所需的表

import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.decorator.ColorHighlighter;
import org.jdesktop.swingx.decorator.HighlightPredicate;

public class MainClass {

    public static void main(String[] args) {
        new MainClass();
    }

    public MainClass() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                CustomTableModel tableModel = new CustomTableModel();
                JXTable table = new JXTable(tableModel);
                table.setDefaultRenderer(Object.class, new CustomTableCellRenderer());
                HighlightPredicate predicate = new HighlightPredicate() {
                    @Override
                    public boolean isHighlighted(Component cmpnt, org.jdesktop.swingx.decorator.ComponentAdapter ca) {
                        System.out.println(ca.getComponent());
                        return ca.hasFocus();
                    }
                };
                table.addHighlighter(new ColorHighlighter(predicate, null, null, new Color(115, 164, 209), Color.WHITE));

                JScrollPane scrollPane = new JScrollPane(table);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(scrollPane);
                frame.setVisible(true);
                frame.pack();
            }
        });
    }

    class CustomTableCellRenderer extends DefaultTableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            return (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }
    }

    class CustomTableModel extends AbstractTableModel {

        ArrayList<Object[]> al;

        public CustomTableModel() {
            al = new ArrayList<Object[]>();
            Object[] row = {1, 2, 3, "A", "Collection", "of", "Random", "Strings", 9, 10};
            al.add(row);
            Object[] row2 = {11, 12, 13, "Another", "Collection", "Of", "Random", "Strings", 19, 20};
            al.add(row2);
            Object[] row3 = {11, 12, 13, "Another", "Collection", "Of", "Random", "Strings", 19, 20};
            al.add(row3);
            Object[] row4 = {11, 12, 13, "It", "just", "gets", "more", "random...", 19, 20};
            al.add(row4);
        }

        public int getRowCount() {
            return al.size();
        }

        public int getColumnCount() {
            return 10;
        }

        public Object getValueAt(int rowIndex, int columnIndex) {
            return al.get(rowIndex)[columnIndex];
        }
    }
}

导入java.awt.Color;
导入java.awt.Component;
导入java.awt.EventQueue;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.event.ListSelectionEvent;
导入javax.swing.event.ListSelectionListener;
导入javax.swing.table.AbstractTableModel;
导入javax.swing.table.DefaultTableCellRenderer;
导入org.jdesktop.swingx.JXTable;
导入org.jdesktop.swingx.decorator.ColorHighlighter;
导入org.jdesktop.swingx.decorator.HighlightPredicate;
公共类主类{
公共静态void main(字符串[]args){
新的main类();
}
公共类(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame=新JFrame();
CustomTableModel tableModel=新的CustomTableModel();
JXTable table=新的JXTable(tableModel);
setDefaultRenderer(Object.class,新的CustomTableCellRenderer());
HighlightPredicate谓词=新的HighlightPredicate(){
@凌驾
公共布尔值isHighlighted(组件cmpnt,org.jdesktop.swingx.decorator.ComponentAdapter ca){
System.out.println(ca.getComponent());
返回ca.hasFocus();
}
};
表.addHighlighter(新颜色highlighter(谓词,null,null,新颜色(115164209),Color.WHITE));
JScrollPane scrollPane=新的JScrollPane(表);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(滚动窗格);
frame.setVisible(true);
frame.pack();
}
});
}
类CustomTableCellRenderer扩展了DefaultTableCellRenderer{
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔isSelected、布尔hasFocus、int行、int列){
return(JLabel)super.getTableCellRenderComponent(表、值、isSelec
class JXXTable extends JXTable {
    DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
    HighlightPredicate predicate = new HighlightPredicate(){
        public boolean isHighlighted(Component renderer, ComponentAdapter adapter) {
            return adapter.hasFocus();
        }
    };
    Highlighter cellHighlight = new ColorHighlighter(predicate, null, null, new Color(115,164,209), Color.WHITE);

    public JXXTable(CustomTableModel model){ 
        super(model); 
        this.setDefaultRenderer(Object.class, renderer);
    }
    public void Paint(){
        this.setDefaultRenderer(Object.class, renderer);
        this.setHighlighters();
        this.addHighlighter(cellHighlight); 
    }
}