2013-10-04 3 views
-1

Я хочу создать заголовок jtable с шаблоном по умолчанию BOLD. Вот мой кодКак сделать заголовок таблицы defaulttablemodel жирным шрифтом

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; 
     }; 

     }; 

Я хочу сделать столбец заголовков BOLD. любой намек на это ценится

+1

-1 вы еще не читали на некоторые основы (в отношении ОО/Swing), как вам посоветовали сделать в более ранних вопросах, не так ли? Все же те же самые ошибки ... Что касается вашего вопроса здесь: _model_ не несет ответственности за визуальные эффекты, а также не отвечает за внешний вид своего заголовка, поэтому ваш фрагмент кода не связан с проблемой, о которой вы заявили – kleopatra

ответ

2

Как ни странно, заголовок столбца таблицы использует ту же концепцию для визуализации, таких как таблица делает ...

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

Например. Но я не думаю, что получится так, как вы хотите его ...

Вместо этого, вы можете попробовать что-то вроде ...

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

enter image description here

+0

, безусловно, возможно, но просто поскольку, конечно, (IMO) слишком грязно: модель не должна брать на себя ответственность за рассмотрение. Если вы хотите использовать html для достижения полужирного шрифта, лучше сделайте это в TableColumn: настройте или реализуйте, чтобы он возвращал html как headerValue – kleopatra

+0

@kleopatra, если рендеринг заголовка таблицы по умолчанию был фактически основан на реализации внешнего вида, я бы согласитесь, но этот незначительный небольшой надзор крайне расстраивает. – MadProgrammer

+0

hmm ... похоже, я не понимаю, что вы говорите ;-) a) обработчик заголовка по умолчанию _is_ LAF зависимый, b) какой надзор? – kleopatra

3

уборщицей (чем @ Mad) для персонализированного визуализатора в рендерере - реализовать средство рендеринга обертки вокруг значения по умолчанию: он делегирует всю конфигурацию по умолчанию, а не применяет пользовательские декорации. Выполнение этого сохраняет специфические визуальные эффекты 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; 
    } 

} 

Для использования, замены по умолчанию заголовке с оберточной визуализатора и обновления на изменения 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); 
Смежные вопросы