[英]Changing Swing JTable Cell Colors
我正在嘗試適應 JTables、TableModels、JTableHeaders、渲染器等。我正在嘗試制作一個簡單的虛擬表(用於練習目的),如下所示:
- 1 2 3
A A1 A2 A3
B B1 B2 B3
C C1 C2 C3
我還希望 B2 單元格 - 只有那個單元格 - 具有藍色 (Color.BLUE) 背景 - 所有其他單元格都可以具有自動分配的 Swing 默認顏色。
我的代碼如下,基於我在本網站和整個互聯網上找到的無數示例。 但我沒有得到我想要的結果。 相反,我得到了一個看起來像這樣的表:
A A1 A2 A3
B B1 B2 B3
C C1 C2 C3
請注意,第一行(標題)根本不存在。 此外,使用我在下面列出的代碼,這將執行並設置所有着色單元格的顏色,而不僅僅是我想要的 B2 單元格。
代碼:
public class MyTable
{
public static void main(String[] args)
{
String[][] data = getTableData();
String[] cols = getTableCols();
JFrame frame = magicallyCreateJFrame(); // I promise this works!
MyRenderer myRenderer = new MyRenderer(); // See below
DefaultTableModel defModel = new DefaultTableModel(data, cols);
JTable myTable = new JTable(defModel);
myTable.setDefaultRenderer(Object.class, myRenderer);
frame.add(myTable);
frame.pack();
frame.setVisible(true);
}
}
public static String[] getTableCols()
{
String cols =
{
"-",
"1",
"2",
"3",
};
}
public static String[][] getTableData()
{
String[][] data =
{
{
"A",
"A1",
"A2",
"A3",
},
{
"B",
"B1",
"B2",
"B3",
},
{
"C",
"C1",
"C2",
"C3",
},
};
return data;
}
以及快速骯臟的MyRenderer
類:
public class MyRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if(row == 2 && column == 2)
c.setBackground(new java.awt.Color(0, 0, 255));
return c;
}
}
除了這是可怕的代碼並且破壞了許多“最佳實踐”類型的模式和技術(記住這只是我正在玩的東西)這一事實之外,我在這里做的有什么明顯明顯的嗎? 為什么我沒有得到表頭(第一行“- 1 2 3”)? 為什么我的默認單元格渲染器不能在我指定的特定 B2 單元格上工作?
JTables 似乎是奇怪、美麗和強大的野獸。 我正在慢慢地思考它們,但對實施感到窒息。 感謝任何可以提供幫助的人!
您需要確保將渲染器重置為其默認背景顏色(並處理行選擇):
if (! table.isRowSelected(row))
{
if(row == 2 && column == 2)
c.setBackground(new java.awt.Color(0, 0, 255));
else
c.setBackground(table.getBackground());
}
在未來發布一個適當的SSCCE與您的問題。
半答案:
您需要將JTable
放在JScrollPane
才能顯示標題。 或者,您可以手動將myTable.getTableHeader()
返回的組件添加到布局中。 不過我建議使用JScrollPane
。
編輯:
如下所示,要將特定單元格的背景變成藍色,您需要做的就是添加一個這樣的測試:
if(column == 2 && row == 1) {
c.setBackground(Color.BLUE);
} else {
c.setBackground(Color.WHITE);
}
您在哪里指定渲染器為 B2 和僅 B2 着色? 也許您想在 getTableCellRendererComponent 方法中放置一個 if 塊,以便僅當 JTable 的值對象的 toString() 為“B2”或行和列值對應於 B2 單元格時,背景顏色才設置為藍色。
要查看您的表頭,您應該首先將表添加到 JScrollPane,然后將 JScrollPane 添加到父級。
最重要的是:閱讀有關 JTables 的 Swing 教程,因為所有內容都在那里進行了解釋。
也許, myTable.setDefaultRenderer(String.class, myRenderer);
會正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.