2014-07-20 26 views
4

嗨,我是新的java jtable cellrended。我正在寻找一种能够在我的程序中工作的方式,但我没有任何运气可以找到它。 这里是我的JTable根据列值更改JTable行的背景颜色

Employee ID | Name  | Status | Position 
    00565651  Roger  Active  Manager 
    00565652  Gina  Active  Crew 
    00565652  Alex  Inactive  Crew 
    00565652  Seph  Active  Manager  

从MS Access数据库中的数据来了,但我想改变其在状态栏中的“无效”值的行的背景/前景。我在互联网上发现了很多例子,但所有这些在我的程序中都是不可能的。有人能帮我吗? 这是我的模型

String[] columnNames = {"Employee ID","Name", "Status", "Position"}; 
DefaultTableModel model = new DefaultTableModel(columnNames, 0); 

,这是创造我的表的方式,以及如何我从数据库中获取数据

public MyList(){//my constructor 
    frame(); 
    loadListFromDB(); 
} 
public void frame(){// 
    //codes for frame setsize,titles etc... 
    tblList = new JTable(); 
    tblList.getTableHeader().setPreferredSize(new Dimension(100, 40)); 
    tblList.getTableHeader().setFont(new Font("SansSerif", Font.BOLD, 25)); 
    tblList.setAutoCreateRowSorter(true); 
    tblList.setModel(model); 
    scrollPane.setViewportView(tblList); 
    loadListFromDB(); 

} 
public void loadListFromDB(){ 
    String sql = "SELECT emp_id,lname,fname,positional_status from tblEmployee"; 
    try{ 
     PreparedStatement ps = conn.prepareStatement(sql); 
     ResultSet rs = ps.executeQuery(); 
     while (rs.next()){ 
      Vector row = new Vector(); 
      for (int i = 1; i <= 4; i++){ 
       row.addElement(rs.getObject(i)); 
      } 
      model.addRow(row); 
     } 
    }catch(Exception err){ 
     //for error code 
    } 
} 

我怎么想加入这样的tableredered?任何人都可以举个简单的例子来改变行的颜色?在此先感谢..我的程序停在这个问题上。

+0

可能重复http://stackoverflow.com/questions/3548986/how-do-i-set-the-jtable-column-and -row-color) – DavidPostill

+0

但是数据刚刚从一开始就被初始化了,我的数据来自数据库,我不知道如何把我的数据放在字符串[] []的基础上。 –

+0

你的问题不在于把数据放在表格中,而是改变行的颜色。您应该查看示例中的TableCellRenderer部分并将渲染添加到您的表中。 – DavidPostill

回答

14

“我想改变它的值为行的背景/前景‘’在状态栏”

不活跃这真的只是一个正从表/模型中的价值的问题。如果该行的状态为非活动状态,则为该行中的每个单元格设置背景/前景。由于渲染器是针对每个单元渲染的,因此基本上需要获取[row][statusColumn]的值,并且这将是每行的状态值。像

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){ 
    @Override 
    public Component getTableCellRendererComponent(JTable table, 
      Object value, boolean isSelected, boolean hasFocus, int row, int col) { 

     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 

     String status = (String)table.getModel().getValueAt(row, STATUS_COL); 
     if ("active".equals(status)) { 
      setBackground(Color.BLACK); 
      setForeground(Color.WHITE); 
     } else { 
      setBackground(table.getBackground()); 
      setForeground(table.getForeground()); 
     }  
     return this; 
    } 
}); 

的东西在这里是一个简单的例子

enter image description here

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 

import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class TableRowDemo { 

    private static final int STATUS_COL = 1; 

    private static JTable getTable() { 
     final String[] cols = {"col 1", "status", "col 3"}; 
     final String[][] data = { 
       {"data", "active", "data"}, 
       {"data", "inactive", "data"}, 
       {"data", "inactive", "data"}, 
       {"data", "active", "data"} 
     }; 
     DefaultTableModel model = new DefaultTableModel(data, cols); 
     return new JTable(model) { 
      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(350, 150); 
      } 
     }; 
    } 

    private static JTable getNewRenderedTable(final JTable table) { 
     table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){ 
      @Override 
      public Component getTableCellRendererComponent(JTable table, 
        Object value, boolean isSelected, boolean hasFocus, int row, int col) { 
       super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col); 
       String status = (String)table.getModel().getValueAt(row, STATUS_COL); 
       if ("active".equals(status)) { 
        setBackground(Color.BLACK); 
        setForeground(Color.WHITE); 
       } else { 
        setBackground(table.getBackground()); 
        setForeground(table.getForeground()); 
       }  
       return this; 
      } 
     }); 
     return table; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JOptionPane.showMessageDialog(null, new JScrollPane(getNewRenderedTable(getTable()))); 
      } 
     }); 
    } 
} 

另一种选择是@Override表prepareRenderer。它会给你同样的结果。

import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 

import javax.swing.JOptionPane; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 

public class TableRowDemo { 

    private static final int STATUS_COL = 1; 

    private static JTable getTable() { 
     final String[] cols = {"col 1", "status", "col 3"}; 
     final String[][] data = { 
       {"data", "active", "data"}, 
       {"data", "inactive", "data"}, 
       {"data", "inactive", "data"}, 
       {"data", "active", "data"} 
     }; 
     DefaultTableModel model = new DefaultTableModel(data, cols); 
     return new JTable(model) { 
      @Override 
      public Dimension getPreferredScrollableViewportSize() { 
       return new Dimension(350, 150); 
      } 
      @Override 
      public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 
       Component c = super.prepareRenderer(renderer, row, col); 
       String status = (String)getValueAt(row, STATUS_COL); 
       if ("active".equals(status)) { 
        c.setBackground(Color.BLACK); 
        c.setForeground(Color.WHITE); 
       } else { 
        c.setBackground(super.getBackground()); 
        c.setForeground(super.getForeground()); 
       } 
       return c; 
      } 
     }; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JOptionPane.showMessageDialog(null, new JScrollPane(getTable())); 
      } 
     }); 
    } 
} 
的[如何设置JTable中列和行颜色?(
+0

非常感谢,这正是我正在寻找... – Zohaib

+0

很好的答案我一直在寻找。 我们可以同时更改表头的样式吗? –

+0

@peeskillet如何修改prepare renderer方法以更改列而不是行的背景颜色? – Aequitas