2013-07-31 68 views
0

我有一个方法应该改变JTable中某个特定单元格的颜色,但所有单元格都会改变颜色。JTable为所有单元格而不仅是特定单元格颜色

这就是我想实现的方法:

public Component cellBG(JTable table, int row, int column) 
{ 
    TableCellRenderer renderer = table.getCellRenderer(row, column); 
    Component c = table.prepareRenderer(renderer, row, column); 

    Object steak = table.getValueAt(row,column); 

    if(((String) steak).startsWith("+")) 
    { 
     c.setBackground(Color.GREEN); 
    } 
    else if(((String) steak).startsWith("-")) 
    { 
     c.setBackground(Color.RED); 
    } 
    else if(((String) steak).startsWith("~")) 
    { 
     c.setBackground(Color.YELLOW); 
    } 
    else if(((String) steak).equals("")) 
    { 
     c.setBackground(Color.WHITE); 
    } 

    return c; 

} 

我的表中包含8行10列的所有含要么+, - , - ,或“”,这将导致一个分散的模式我不同的颜色,但是tabel在最后一个被读取的entri中颜色固定。每个请求

屁股的SSCCE

import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.Color; 
import java.awt.Font; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JFrame; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.JTableHeader; 
import javax.swing.table.TableCellRenderer; 

public class ptf_viewer extends JFrame { 

    static JTable table; 
    static DefaultTableModel model; 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        ptf_viewer frame = new ptf_viewer(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public ptf_viewer(){ 
    getContentPane().setBackground(Color.WHITE); 
    setTitle("Portable test file viewing"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(50, 50, 1024, 768); 
    getContentPane().setLayout(null); 

    final String[] columnNames = {"Test 1", "Test 2", "Test 3", "Test 4", "Test 5", "Test 6", "Test 7", "Test 8", "Test 9", "Test 10"}; 
    final Object[][] data = { 
       {"+","+","","","","~","","","",""}, 
       {"-","+","","","","","","","",""}, 
       {"+","+","","","~","","","","",""}, 
       {"+","+","","","","","~","","",""}, 
       {"+","-","","~","","","","","",""}, 
       {"+","-","","","","","","","",""}, 
       {"+","-","","","","","","","",""}, 
       {"-","+","~","","","","","","","+"} 
    }; 
    model = new DefaultTableModel(data, columnNames); 
    table = new JTable(data, columnNames); 
    table.setModel(model); 
    for(int i = 0 ; i < 8 ; i++){ 
      cellBG(table, i, 9); 
    } 
    JTableHeader header = table.getTableHeader(); 
    header.setFont(new Font("Times New Roman", Font.BOLD, 13)); 
    header.setBackground(Color.black); 
    header.setForeground(Color.white); 

    JScrollPane scrollPane = new JScrollPane(table); 
    scrollPane.setSize(988, 618); 
    scrollPane.setFont(new Font("Times New Roman", Font.BOLD, 13)); 
    scrollPane.setLocation(10, 60); 
    getContentPane().add(scrollPane); 
    } 
    public Component cellBG(JTable table, int row, int column) 
    { 
     TableCellRenderer renderer = table.getCellRenderer(row, column); 
     Component c = table.prepareRenderer(renderer, row, column); 

     Object bøf = table.getValueAt(row,column); 

     if(((String) bøf).startsWith("+")) 
     { 
      c.setBackground(Color.GREEN); 
     } 
     else if(((String) bøf).startsWith("-")) 
     { 
      c.setBackground(Color.RED); 
     } 
     else if(((String) bøf).startsWith("~")) 
     { 
      c.setBackground(Color.YELLOW); 
     } 
     else if(((String) bøf).equals("")) 
     { 
      c.setBackground(Color.WHITE); 
     } 
     return c; 
    } 
    } 
+1

貌似渲染器是通过表中的所有单元格共享。渲染器检查的最后一个单元格将为所有单元格赋予颜色。 –

+3

更好地帮助发布一个[SSCCE](http://sscce.org/),短的,可运行的,可编译的JTable的hardocded值(包含10行,包含8行,全部包含+, - ,〜或者“” ,),问题如何可能是你的prepareRenderer绘画 – mKorbel

+0

@JonathanDrapeau精确分析。虽然不足为奇,但渲染器被设计为共享:-) – kleopatra

回答

2

您需要创建自己的单元格渲染器,并使其返回根据包含在单元格中的文本正确的背景颜色。

public class MyTableCellRenderer extends DefaultTableCellRenderer { 
    @Override 
    public Color getBackground() { 
     String steak = getText(); 
     if (steak.startsWith("+")) { 
      return Color.GREEN; 
     } else if (steak.startsWith("-")) { 
      return Color.RED; 
     } else if (steak.startsWith("~")) { 
      return Color.YELLOW; 
     } else if (steak.equals("")) { 
      return Color.WHITE; 
     } 

      return super.getBackground(); 
     } 
    } 
} 

并确保您的表使用它。

table.setDefaultRenderer(String.class, new MyTableCellRenderer()); 

假设您的所有细胞类型为String。 SSCCE后

编辑: 类是Obejct,而不是String,使用

table.setDefaultRenderer(Object.class, new MyTableCellRenderer()); 
+2

要小心:这会松散选择视觉效果 – kleopatra

+0

我试图实现这一点,但它仍然不起作用,现在是白色,我也是试图从getBackground更改为setBackground,但没有任何内容 – abbisDK

+0

@abbisDK然后提供一个SSCCE。它应该工作,但没有所有的代码,这是不可能的,以帮助你更多。 –

2

abbisDK写道 - SSCCE制成,加入到质疑,

  • 看到通过使用DefaultTableCellRendererPattern.compile(多种方法之一,Strin.equals()或String.startWith)包含另外,并且很容易)

  • 一样的,所以很similair代码可用于prepareRenderer

table = new JTable(data, columnNames) { 
    //logics place for prepareRenderer 
}; 

enter image description here

从代码

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.util.regex.Pattern; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.JTableHeader; 
import javax.swing.table.TableColumn; 

public class Ptf_Viewer { 

    private JFrame frame = new JFrame("Portable test file viewing"); 
    private JTable table; 
    private final String[] columnNames = {"Test 1", "Test 2", "Test 3", "Test 4", 
     "Test 5", "Test 6", "Test 7", "Test 8", "Test 9", "Test 10"}; 
    private final Object[][] data = { 
     {"+", "+", "", "", "", "~", "", "", "", ""}, 
     {"-", "+", "", "", "", "", "", "", "", ""}, 
     {"+", "+", "", "", "~", "", "", "", "", ""}, 
     {"+", "+", "", "", "", "", "~", "", "", ""}, 
     {"+", "-", "", "~", "", "", "", "", "", ""}, 
     {"+", "-", "", "", "", "", "", "", "", ""}, 
     {"+", "-", "", "", "", "", "", "", "", ""}, 
     {"-", "+", "~", "", "", "", "", "", "", "+"} 
    }; 
    private DefaultTableModel model = new DefaultTableModel(data, columnNames); 

    public Ptf_Viewer() { 
     table = new JTable(data, columnNames) { 
      //logics place for prepareRenderer 
     }; 
     table.setModel(model); 
     table.setPreferredScrollableViewportSize(
       new Dimension(800, table.getPreferredSize().height)); 
     JTableHeader header = table.getTableHeader(); 
     header.setFont(new Font("Times New Roman", Font.BOLD, 13)); 
     header.setBackground(Color.black); 
     header.setForeground(Color.white); 
     for (int i = 0; i < table.getColumnCount(); i++) { 
      RowColorRenderer rowRenderer = new RowColorRenderer(i); 
      TableColumn column = table.getColumnModel().getColumn(i); 
      column.setCellRenderer(rowRenderer); 
     } 
     JScrollPane scrollPane = new JScrollPane(table); 
     scrollPane.setFont(new Font("Times New Roman", Font.BOLD, 13)); 
     frame.add(scrollPane); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(50, 50); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private class RowColorRenderer extends DefaultTableCellRenderer { 

     private static final long serialVersionUID = 1L; 
     private int colNo = 0; 

     RowColorRenderer(int col) { 
      colNo = col; 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, 
       boolean isSelected, boolean hasFocus, int row, int column) { 
      Component comp = super.getTableCellRendererComponent(table, value, 
        isSelected, hasFocus, row, column); 
      JComponent jc = (JComponent) comp; 
      if (!isSelected) { 
       if (table.getValueAt(row, colNo) != null) { 
        String str = table.getValueAt(row, colNo).toString(); 
        if (!str.isEmpty()) { 
         if ((Pattern.compile("[+]").matcher(str).find())) { 
          setForeground(Color.magenta); 
          setBackground(Color.GREEN); 
          setFont(new Font("Serif", Font.BOLD, 16)); 
          setHorizontalAlignment(CENTER); 
         } else if ((Pattern.compile("[-]").matcher(str).find())) { 
          setForeground(Color.blue); 
          setBackground(Color.RED); 
          setFont(new Font("Serif", Font.BOLD, 16)); 
          setHorizontalAlignment(CENTER); 
         } else if ((Pattern.compile("[~]").matcher(str).find())) { 
          setForeground(Color.red); 
          setBackground(Color.YELLOW); 
          setFont(new Font("Serif", Font.BOLD, 16)); 
          setHorizontalAlignment(CENTER); 
         } else { 
          setBackground(Color.WHITE); 
          setForeground(table.getForeground()); 
          setFont(new Font("Serif", Font.PLAIN, 12)); 
          setHorizontalAlignment(CENTER); 
         } 
        } else { 
         setBackground(Color.WHITE); 
         setForeground(table.getForeground()); 
        } 
       } 
      } 
      return this; 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Ptf_Viewer frame = new Ptf_Viewer(); 
      } 
     }); 
    } 
} 
+0

不需要从表中获取值,因为:a)您将它作为参数b)super已经设置了它:-) – kleopatra