[英]JTable Row Header Look And Feel
我正在嘗試為我的JTable創建行標題。 我在這里和這里完成了我的研究,但幾乎沒有任何東西。 我發現的並沒有保持系統的外觀。
這是我到目前為止發現的:
第一列(沒有名字的那一欄)是我能做到的最好的。 我拿了表頭渲染器並將其應用於行單元格。 它部分奏效了。 如您所見,降序/升序排序的小箭頭圖標出現在列的每個單元格中,單元格現在為灰色。 除此之外,它完全失敗了。 此外,我不希望我的行標題中有任何箭頭圖標。
Col 1是我嘗試應用UIManager的外觀時發生的事情。 顯然它沒有用。
Col 2是photoshop ,這是我想要做的。
我沒有對其他2列做任何事情,所以它是默認設置。
問題是:我如何將系統(不僅是windows)默認表頭的外觀和感覺賦予行單元格以創建行標題,當然也沒有小箭頭圖標。
這是代碼
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import sun.swing.table.DefaultTableCellHeaderRenderer;
public class RowHeaderTest extends JFrame
{
public RowHeaderTest()
{
initComponents();
}
private void initComponents()
{
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane();
JTable table = new JTable();
table.setAutoCreateRowSorter(true);
table.getTableHeader().setReorderingAllowed(false);
table.setModel(new DefaultTableModel(
new Object[][]
{
{
"Row 1", "Data 2", "Data 3", "Data 4", "Data 5"
},
{
"Row 2", "Data 6", "Data 7", "Data 8", "Data 9"
},
{
"Row 3", "Data 10", "Data 11", "Data 12", "Data 13"
}
},
new String[]
{
"", "Col 1", "Col 2", "Col 3", "Col 4"
}));
table.getColumnModel().getColumn(0).setHeaderRenderer(HeaderRenderer.THIS);
table.getColumnModel().getColumn(0).setCellRenderer(HeaderRenderer.THIS);
table.getColumnModel().getColumn(1).setHeaderRenderer(HeaderRendererUI.THIS);
table.getColumnModel().getColumn(1).setCellRenderer(HeaderRendererUI.THIS);
table.getColumnModel().getColumn(3).setHeaderRenderer(RowTableHeaderRendere.THIS);
table.getColumnModel().getColumn(3).setCellRenderer(RowTableHeaderRendere.THIS);
scrollPane.setViewportView(table);
setSize(new Dimension(400, 200));
setLocationRelativeTo(null);
add(scrollPane);
}
public static void main(String args[])
{
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex)
{
java.util.logging.Logger.getLogger(RowHeaderTest.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
new RowHeaderTest().setVisible(true);
}
});
}
}
final class HeaderRenderer extends DefaultTableCellHeaderRenderer
{
public static final HeaderRenderer THIS = new HeaderRenderer();
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
return renderer.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
}
}
final class HeaderRendererUI extends DefaultTableCellHeaderRenderer
{
public static final HeaderRendererUI THIS = new HeaderRendererUI();
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
setText(value.toString());
//TableHeader.ancestorInputMap
setBackground(isSelected ? UIManager.getColor("TableHeader.focusCellBackground") : UIManager.getColor("TableHeader.background"));
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setFont(UIManager.getFont("TableHeader.font"));
setForeground(UIManager.getColor("TableHeader.foreground"));
return this;
}
}
final class RowTableHeaderRendere extends DefaultTableCellHeaderRenderer
{
public static final RowTableHeaderRendere THIS = new RowTableHeaderRendere();
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
JTable t = new JTable(new DefaultTableModel(
null,
new String[]
{
value.toString()
}));
return t.getTableHeader();
}
}
編輯
我剛剛為代碼添加了部分解決方案。 Col 3現在看起來很漂亮,但仍然缺乏感覺(它沒有鼠標懸停),我不太確定創建一個新表只是為了獲得標題是最好的方法。
要保持System LookAndFeel,您需要稍微更改渲染器。
首先使用UIRessource擴展渲染器。 您需要此標記接口才能接收UI更改:
class HeaderRenderer extends DefaultTableCellHeaderRenderer
implements javax.swing.plaf.UIResource {
然后從JTableHeader獲取並保持原始渲染器(例如,由構造函數傳遞的字段defRenderer)。 在getTableCellRendererComponent中調用defRenderer.getTableCellRendererComponent,修改並返回此JLabel。
private final TableCellRenderer defRenderer;
HeaderRenderer (TableCellRenderer defRenderer) {
this.defRenderer = defRenderer;
}
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
Component c = defRenderer.getTableCellRendererComponent (...);
if ( c instanceof JLabel ) {
JLabel lbl = (JLabel)c;
// do anything you want...
}
return c;
}
至少覆蓋Renderer中的updateUI()方法並刪除對defRenderer的updateUI調用:
@Override
public void updateUI() {
TableCellRenderer locDefRenderer = defRenderer;
if (locDefRenderer instanceof JComponent) {
((JComponent) locDefRenderer).updateUI();
} else {
super.updateUI();
}
}
有了這張收據,就可以改變很多東西。 普通paintComponent組件渲染有點復雜;-) - 對於自己的塗料使用JLayer(在Java 7中引入)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.