1. 程式人生 > >JTable中新增元件後,改變當選中時的背景色

JTable中新增元件後,改變當選中時的背景色

在JTable中新增元件後,當我們選中某一行時,我們會發現其他欄的背景色會變為table設定的選中背景色,而帶有元件的那一欄背景色卻不變

這時,我們需要在TableCellRenderer中新增一個填充方法

下面以JLable元件為例:

import java.awt.Component;
import java.awt.Image;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class MyLabelRenderer extends JLabel implements TableCellRenderer{

	public void fillColor(JTable t,JLabel l,boolean isSelected ){
		
        if(isSelected){
            l.setBackground(t.getSelectionBackground());
            l.setForeground(t.getSelectionForeground());
        }

        else{ //如果想讓元件不使用table中的前景色,背景色,把else這段去掉就好了.然後在下面getTableCellRendererComponent()函式中定義自己想要的元件樣式
l.setBackground(t.getBackground()); l.setForeground(t.getForeground()); } } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { // TODO Auto-generated method stub URL url=MyButtonRenderer.class.getResource(value+".png"); ImageIcon icon=new ImageIcon(url); icon.setImage(icon.getImage().getScaledInstance(22, 22, Image.SCALE_DEFAULT)); setIcon(icon); setText(value.toString()); setBorder(BorderFactory.createEmptyBorder(3,10,3,10)); setOpaque(true);//元件要設定為不透明 fillColor(table,this,isSelected);//呼叫填充方法 return this; } }
對了,如果元件為進度條JProgressBar,並且設定了進度條顏色時,別忘了把fillColor()中的l.setForeground(t.getSelectionForeground());去掉

JTable的預設選中前景色(SelectionForeground)為黑色

附張截圖: