2014-09-05 29 views
0

我使用下面的代码来设置备用背景色排在JTable中:无法设置自定义背景色JTable中

table = new JTable(model); 
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() 
{//alternate background color for rows 
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 (!isSelected) 
      c.setBackground(row % 2 == 0 ? Color.white : Color.lightGray); 
     return c; 
    }; 
}); 

和它的作品。 不过,我想用一个自定义颜色RGB说(242242242)代替LIGHTGRAY作为替代颜色,但这样做的时候:

final Color alternateColor = new Color (242,242,242); 
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() 
{//alternate background color for rows 
    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 (!isSelected) 
      c.setBackground(row % 2 == 0 ? Color.white : alternateColor); 
     return c; 
    }; 
}); 

替代颜色完全被忽略,所有行具有白色背景。它看起来像这种方法只适用于属于Color enum的颜色。怎么会?

这是一个完整的工作示例接着将得到的画面:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import javax.swing.*; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class Test extends JFrame 
{ 
private JTable    table    = null; 
private Object[]   columnTitle = { "Column1", "Column2", "Column3" }; 
private Object[][]   data    = null; 
private DefaultTableModel model    = null; 
private JPanel    panel    = null; 
private JScrollPane  scroller   = null; 

public Test() 
    { 
     super(); 
     setLayout(new BorderLayout()); 
     panel = new JPanel(); 
     scroller=new JScrollPane(); 
     data = new Object[3][3]; 

     for (int i=0; i<3; i++) 
      { 
       for (int j=0; j<3; j++) 
        { 
         data [i][j]="Test"; 
        } 
      } 

     model = new DefaultTableModel(data, columnTitle); 
     table = new JTable(model); 
     final Color alternateColor=new Color(242,242,242); 
     table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() 
     {//alternate background color for rows 
        @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 (!isSelected) 
           c.setBackground(row % 2 == 0 ? Color.white : alternateColor); 
          return c; 
         }; 
       }); 

     scroller.setViewportView(table); 
     panel.add(scroller); 
     this.add(panel, BorderLayout.CENTER); 
    } 

public static void main(String[] args) 
    { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
       { 
        Test test = new Test(); 
        test.setLocationRelativeTo(null); 
        test.pack(); 
        test.setVisible(true); 
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       } 
     }); 
    } 
} 

enter image description here

这里是Color.lightGray屏幕: enter image description here

+2

不,对我来说工作得很好。考虑提供一个[可运行的示例](https://stackoverflow.com/help/mcve),它可以证明你的问题。这将导致更少的混淆和更好的反应 – MadProgrammer 2014-09-05 06:20:02

+0

如果它适合你,它可能与我正在使用的LAF是Weblaf有关。我没有看到任何其他可能的原因... – Zek101 2014-09-05 06:26:06

+0

但第一个例子适用于weblaf? – MadProgrammer 2014-09-05 06:28:32

回答

1

正常工作对我.. 。

Test

import com.alee.laf.WebLookAndFeel; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class TestTable { 

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

    public TestTable() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       WebLookAndFeel.install(); 

       DefaultTableModel model = new DefaultTableModel(new Object[]{"Test"}, 10); 
       JTable table = new JTable(model); 
       final Color alternateColor = new Color(255, 0, 255); 
       table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {//alternate background color for rows 
        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 (!isSelected) { 
          c.setBackground(row % 2 == 0 ? Color.white : alternateColor); 
         } 
         return c; 
        } 
       }); 
       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

} 

这有可能是一些其他的渲染已经采取烤箱,该表的设置渲染器不是一个在屏幕上的...这么多其他因素,一个runnable example这表明你的问题会elimnate。 ..

+0

非常感谢,我编辑了一个可运行的示例和截图的帖子。 – Zek101 2014-09-05 06:56:18

+0

对不起,感谢您的帮助@MadProgrammer。最后,看起来问题与我的眼睛紧张有关,而不是代码;) – Zek101 2014-09-05 07:16:26

2

覆盖渲染器的方法只适用于有数据(即。字符串)在所有列中使用默认渲染器。如果您的表中有需要不同渲染器的日期或数字数据,该怎么办?

在这种情况下,请查看Table Row Rendering以获得适用于所有数据类型的解决方案。

或者,也许你可以使用:

UIManager.put("Table.alternateRowColor", Color.YELLOW); 

不知道这个属性适用于所有的LAF的。

+0

谢谢你的信息camickr!但是,正如上面的评论所述:经过多次尝试,这证明是位于椅子和屏幕之间的错误,毕竟与代码无关;)) – Zek101 2014-09-06 20:10:27

+0

@ Zek101,我明白了。我只是试图为您或其他读者提供更灵活的解决方案。 – camickr 2014-09-06 22:38:18

+0

非常感谢,我很感激。 – Zek101 2014-09-07 18:56:24

相关问题