为什么不是所有Java Swing JTable都有焦点指示器

为什么不是所有Java Swing JTable都有焦点指示器,java,swing,jtable,Java,Swing,Jtable,我试图弄明白为什么大型应用程序中的一些JTables有焦点指示器,而有些没有。为了调试此问题,我添加了以下代码: UIManager.put("Table.focusCellHighlightBorder",new BorderUIResource( new LineBorder(new Color(255,0,0))); 那些焦点指示器变为红色的JTables,但我仍然没有在所有JTables上看到焦点指示器。知道为什么JTable中的单元格不显示焦点指示器吗?您需要在创建表之前设

我试图弄明白为什么大型应用程序中的一些
JTables
有焦点指示器,而有些没有。为了调试此问题,我添加了以下代码:

UIManager.put("Table.focusCellHighlightBorder",new BorderUIResource(
    new LineBorder(new Color(255,0,0))); 

那些焦点指示器变为红色的
JTables
,但我仍然没有在所有
JTables
上看到焦点指示器。知道为什么
JTable
中的单元格不显示焦点指示器吗?

您需要在创建表之前设置UI属性

如果您仍然有问题,请发布您的演示,因为我们无法猜到您在做什么。

可能是他的意思(在您的示例中添加一些内容…)

publicjavagui(){
CustomModel model=新CustomModel();
JTable表格=新JTable(型号){
私有静态最终长serialVersionUID=1L;
外部专用边框=新的MatteBorder(1,0,1,0,Color.red);
内部私有边框=新的清空顺序(0,1,0,1);
专用边框高亮显示=新的复合边框(外部、内部);
@凌驾
公共组件预处理器(
TableCellRenderer渲染器,int行,int列){
组件c=super.prepareRenderer(呈现器、行、列);
JComponent jc=(JComponent)c;
如果(isRowSelected(世界其他地区)){
jc.挫折背景(颜色:橙色);
jc.订单(突出显示);
}否则{
jc.挫折背景(颜色:白色);
}
返回c;
}
};

对于(int i=1;i两个JTable都使用了一个单元格呈现程序,该呈现程序子类化了DefaultTableCellRenderer并重写了GetTableCellRenderComponent方法。显示焦点指示器的JTable被重写的GetTableCellRenderComponent方法称为super.GetTableCellRenderComponent方法,但被重写的GetTableCellRenderComponen方法未显示焦点指示器的JTable的t方法未调用super.getTableCellRenderComponent方法

带焦点指示器的JTable:

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int col) {
    Component comp = super.getTableCellRendererComponent(table, value,
        isSelected, hasFocus, row, col);
    ....
    public Component getTableCellRendererComponent(JTable table, Object value,
                                             boolean isSelected,
                                             boolean hasFocus, int row,
                                             int col) {
  for (int i = 0; i < ids.length; i++) {
      ....
无焦点指示器的JTable:

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int col) {
    Component comp = super.getTableCellRendererComponent(table, value,
        isSelected, hasFocus, row, col);
    ....
    public Component getTableCellRendererComponent(JTable table, Object value,
                                             boolean isSelected,
                                             boolean hasFocus, int row,
                                             int col) {
  for (int i = 0; i < ids.length; i++) {
      ....
公共组件GetTableCellRenderComponent(JTable表、对象值、,
他当选了,,
布尔hasFocus,int行,
整数(col){
for(int i=0;i
您是否检查了
null
?另请参见此。@trashgood请查看我基于camickr的帖子example@trashgod我在带有焦点指示器的JTable和没有焦点指示器的JTable中检查了cellRenderer中的边框,这两个JT的边框都是right=left=top=bottom=1;我仍在寻找这两个JT之间的不同之处但是到目前为止还没有运气。@splatek,你还没有发布SSCCE!!啊,我刚刚在我的
display()
方法的开头添加了海报的
UIManager.put()
,正如@camickr所建议的。我并不是故意刁难,只是我很少有Java经验,如果我试图隔离这些代码(从几个类中提取代码片段)创建一个SSCCE不能保证它会有相同的错误。我更感兴趣的是知道哪些属性/方法控制焦点指示器的显示,这样我就可以知道在哪里集中精力搜索这个错误。也许我只需要自己奋斗一段时间。如果我真的成功获得了SSCCE或一个解决方案,我一定会发布。这就是创建SSCCE以简化问题的关键所在。通常,当您创建SSCCE时,您会发现代码是有效的。因此,您需要确定工作代码与实际代码之间有什么不同。您可以通过一次添加一个功能来实现这一点。当它停止工作时,您就有了隔离了问题。现在,您可以修复它,或者如果您不理解它导致问题的原因,您可以问一个包含更具体信息的问题。感谢您提供有关SSCCE的提示。我将尝试在下一个问题中使用它。