简体   繁体   English

如何使defaulttablemodel表标题加粗

[英]How to make the defaulttablemodel table header bold

I want to make the header of a jtable with defaulttablemodel BOLD. 我想使用defaulttablemodel BOLD使jtable的标头。 Here's my code 这是我的代码

class TablePanel extends JPanel {

    private String[] COLUMNS = {"FAMILY MEMBERS", "STAR (NAKSHATRA)"};
       private DefaultTableModel model = new DefaultTableModel(COLUMNS, 0){

        public boolean isCellEditable(int row, int column) {
                return false;
           }

       };
       DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(){

        public void setHorizontalAlignment(int alignment) {
               alignment = (int) CENTER_ALIGNMENT;
           };

       };
       public JTable table = new JTable(model){
         public void setDefaultRenderer(java.lang.Class<?> columnClass, TableCellRenderer renderer) {
             columnClass= String.class;
             renderer=centerRenderer;
         };  
         public void setBackground(Color bg) {
             bg = Color.yellow;
         };

       };

I want to make the column headers BOLD. 我想使列标题为粗体。 any hint on this is appreciated 任何暗示对此表示赞赏

Strangely enough, a table column header uses the same concept to renderer as the table does... 奇怪的是,表列标题使用与表相同的概念进行渲染...

DefaultTableCellRenderer header = new DefaultTableCellRenderer();
header.setFont(header.getFont().deriveFont(Font.BOLD));
JTable table = new JTable();
TableColumnModel model = table.getColumnModel();
model.getColumn(0).setHeaderRenderer(header);

For example. 例如。 But I don't think it will turn out the way you want it to... 但是我不认为这会变成您想要的方式...

Instead, you could try something like... 相反,您可以尝试类似...

DefaultTableModel model = new DefaultTableModel(new Object[]{"<html><b>Happy</b></html>", "Sad"}, 0);
JTable table = new JTable(model);

在此处输入图片说明

A cleaner (than @Mad's) strategy for custom visual in a renderer is to implement a wrapping renderer around the default: it delegates all configuration to the default and than applies custom decorations. 渲染器中用于自定义视觉的一种更清洁(比@Mad的策略)的策略是实现围绕默认值的包装渲染器:它将所有配置委派为默认值,然后应用自定义装饰。 Doing so keeps the LAF specific visuals. 这样做可以保留LAF特定的视觉效果。

public static class HeaderRenderer implements UIResource, TableCellRenderer {

    private TableCellRenderer original;
    public HeaderRenderer(TableCellRenderer original) {
        this.original = original;
    }
    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component comp = original.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        comp.setFont(comp.getFont().deriveFont(Font.BOLD));
        return comp;
    }

}

To use, replace the header's default with the wrapping renderer and update on changes of LAF: 若要使用,请用包装渲染器替换标头的默认值,并更新LAF的更改:

// replace the inital default with our wrapper
TableCellRenderer original = table.getTableHeader().getDefaultRenderer();
table.getTableHeader().setDefaultRenderer(new HeaderRenderer(original));
// a propertyChangeListener that updates the wrapper
PropertyChangeListener pl = new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        // cleanup (to be on the safe side)
        if (table.getTableHeader().getDefaultRenderer() instanceof HeaderRenderer) {
            HeaderRenderer renderer = (HeaderRenderer) table.getTableHeader().getDefaultRenderer();
            table.getTableHeader().setDefaultRenderer(renderer.original);
        }
        // invoke to make sure the ui delegate updated the header renderer
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
                if (!(r instanceof HeaderRenderer)) {
                    table.getTableHeader().setDefaultRenderer(new HeaderRenderer(r));
                    table.getTableHeader().repaint();
                }
            }
        });
    }
};
// register the listener with the UIManager to get notified on LAF changes
UIManager.addPropertyChangeListener(pl);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM