當 JTable 設定表頭並放入 JScrollPane 時,右上角角落區域預設為灰色,與表頭顏色不一致,影響視覺整體性。
JLabel 作為 Corner Component。setOpaque(true)(關鍵步驟,否則背景不繪製)。JScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER, label) 安裝。JLabel cornerLabel = new JLabel();
cornerLabel.setBackground(Color.BLACK); // 目標顏色
cornerLabel.setOpaque(true); // 必須開啟,否則透明
jScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER, cornerLabel);
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class KJTable extends JFrame {
public KJTable() {
setLayout(new BorderLayout());
Object[][] rows = {
{"王明", "中國", 44}, {"姚明", "中國", 25}, {"趙子龍", "西蜀", 1234},
{"曹操", "北魏", 2112}, {"Bill Gates", "美國", 45}, {"Mike", "英國", 33}
};
String[] cols = {"姓名", "國籍", "年齡"};
JTable table = new JTable(new DefaultTableModel(rows, cols));
table.setRowHeight(20);
// 自定義表頭與列渲染器
KJTableCellRenderer renderer = new KJTableCellRenderer();
table.getTableHeader().setDefaultRenderer(renderer);
table.setDefaultRenderer(Object.class, renderer);
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
// 設定右上角顏色
JLabel corner = new JLabel();
corner.setBackground(Color.BLACK);
corner.setOpaque(true);
scrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER, corner);
setSize(300, 200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
static class KJTableCellRenderer extends JLabel implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int col) {
if (row < 0) { // 表頭
setHorizontalAlignment(SwingConstants.CENTER);
setBackground(new Color(45, 145, 180));
setForeground(Color.WHITE);
} else {
setHorizontalAlignment(SwingConstants.LEFT);
if (row % 2 == 0) {
setBackground(new Color(255, 255, 205));
setForeground(Color.BLUE);
} else {
setBackground(new Color(255, 220, 150));
setForeground(Color.RED);
}
}
setText(value.toString());
setOpaque(true);
return this;
}
}
public static void main(String[] args) { new KJTable(); }
}
JScrollPane.getCorner(...) 預設回傳 null,必須先 setCorner 放入元件。JComponent.setOpaque(true) 讓元件繪製背景,預設為 false。UPPER_LEFT_CORNER、LOWER_LEFT_CORNER、LOWER_RIGHT_CORNER。