您的位置:首页 > 编程语言 > Java开发

Java Swing JTable 设置隔行变色

2016-06-22 08:59 726 查看
设置JTable隔行变色,关键是重写方法prepareRenderer.



——————————–以下是演示代码,可自己运行看看——————————-

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.WindowConstants;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import javax.swing.table.TableCellRenderer;

public class JTableAlternateRowColors {

public JTableAlternateRowColors() {
initComponents();
}

public static void main(String[] args) {

try {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new JTableAlternateRowColors();
}
});
}

private void initComponents() {

final JFrame jFrame = new JFrame("Nimbus alternate row coloring");

MyTable table = new MyTable(new String[][]{
{"one", "two", "three"},
{"one", "two", "three"},
{"one", "two", "three"}
}, new String[]{"col1", "col2", "col3"});

table.setFillsViewportHeight(true);//will fill the empty spaces too if any

table.setPreferredScrollableViewportSize(table.getPreferredSize());

JScrollPane jScrollPane = new JScrollPane(table);

jFrame.getContentPane().add(jScrollPane);
jFrame.pack();
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}

class MyTable extends JTable {

public MyTable(String[][] data, String[] fields) {
super(data, fields);
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

if (getFillsViewportHeight()) {
paintEmptyRows(g);
}
}

/**
* Paints the backgrounds of the implied empty rows when the table model is
* insufficient to fill all the visible area available to us. We don't
* involve cell renderers, because we have no data.
*/
protected void paintEmptyRows(Graphics g) {
final int rowCount = getRowCount();
final Rectangle clip = g.getClipBounds();
if (rowCount * rowHeight < clip.height) {
for (int i = rowCount; i <= clip.height / rowHeight; ++i) {
g.setColor(colorForRow(i));
g.fillRect(clip.x, i * rowHeight, clip.width, rowHeight);
}
}
}

/**
* Returns the appropriate background color for the given row.
*/
protected Color colorForRow(int row) {
return (row % 2 == 0) ? Color.RED : Color.PINK;
}

/**
* Shades alternate rows in different colors.
*/
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
if (isCellSelected(row, column) == false) {
c.setBackground(colorForRow(row));
c.setForeground(UIManager.getColor("Table.foreground"));
} else {
c.setBackground(UIManager.getColor("Table.selectionBackground"));
c.setForeground(UIManager.getColor("Table.selectionForeground"));
}
return c;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: