2013-04-12 9 views
0

У меня есть собственный рендерер заголовка таблицы, который будет иметь стандартную метку и кнопку внутри JComponent.TableHeaderRenderer с Nimbus

Проблема, с которой я столкнулась, связана с меткой, возвращаемой средством визуализации по умолчанию. Вызов средства рендеринга по умолчанию предоставляет стандартную метку. Если я верну это, как есть, это выглядит так, как ожидалось. Если я попытаюсь изменить фон или границу, ничего не изменится. Однако изменение переднего плана имеет предполагаемый эффект. Я не хочу просматривать значки сортировки, поэтому я пытаюсь построить JLabel, который выглядит одинаково, минус значки. Это тоже не работает. Мой JLabel непрозрачен.

JLabel l = (JLabel)table.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
this.lbl.setBackground(l.getBackground()); 
return this.lbl; 

Я смотрел на источник DefaultTableHeaderRenderer и я не могу найти что-нибудь особенное, что класс по умолчанию делает.

Я также пробовал следующее без последствий.

this.lbl.setOpaque(true); 
this.lbl.setFont(UIManager.getFont("TableHeader.font")); 
this.lbl.setBorder(UIManager.getBorder("TableHeader.cellBorder")); 
this.lbl.setBackground(UIManager.getColor("TableHeader.background")); 
this.lbl.setForeground(UIManager.getColor("TableHeader.foreground")); 
return this.lbl; 

EDIT: Уточнение. Оба фрагмента кода выше находятся внутри getTableCellRenderComponent() моего настраиваемого средства визуализации. Я пробовал оба пути, и ни один из них не работал.

+1

Вы не должны пытаться модифицировать заголовок вне его процесса рендеринга. Вместо этого вы должны предоставить свою собственную реализацию «TableCellRenderer», которая обеспечивает требуемые функции, и установить ее 'JTableHeader' – MadProgrammer

+0

. Отредактировано для уточнения. Я делаю это внутри пользовательской реализации TableCellEditor. – Dodd10x

+0

Тогда почему вы делаете 'table.getTableHeader(). GetDefaultRenderer()'? – MadProgrammer

ответ

1

Пробуйте использовать значения UIManager s.

TableHeader.background = DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223 
TableHeader.font = javax.swing.plaf.FontUIResource[family=SansSerif,name=sansserif,style=plain,size=12] 
TableHeader.foreground = DerivedColor(color=0,0,0 parent=text offsets=0.0,0.0,0.0,0 pColor=0,0,0 
TableHeader.opaque = true 

Нечто подобное UIManager.getColor("TableHeader.background"), например

Граница я думаю, что вы найдете на самом деле окрашены делегатом UI напрямую.

Обновлен например

enter image description here

С прилежащих изображений, очевидно, что использование UIManager действительно обеспечивает некоторые основных сведения необходимо получить значение, используемое в заголовке, но это обводка рендеринга делает специальную картину, чтобы получить затенение.

Второй столбец - это средство визуализации по умолчанию, а третье - дерзкое. Это, в основном, кража устройства отображения ячеек непосредственно из заголовка таблицы ...

package testcellrenderer; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.Font; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class TestCellRenderer { 

    public static void main(String[] args) { 
     new TestCellRenderer(); 
    } 

    public TestCellRenderer() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      DefaultTableModel model = new DefaultTableModel(
          new Object[][]{{"Testing", "Testing", "Testing"}}, 
          new Object[]{"Test A", "Test B", "Test C"} 
          ); 
      JTable table = new JTable(model); 
      table.getColumn("Test A").setCellRenderer(new TestTableCellRenderer()); 
      table.getColumn("Test C").setCellRenderer(table.getTableHeader().getDefaultRenderer()); 

      setLayout(new BorderLayout()); 
      add(new JScrollPane(table)); 
     } 

    } 

    protected class TestTableCellRenderer extends DefaultTableCellRenderer { 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      Color background = UIManager.getColor("TableHeader.background"); 
      Color foreground = UIManager.getColor("TableHeader.foreground"); 
      Font font = UIManager.getFont("TableHeader.font"); 
      boolean opaque = UIManager.getBoolean("TableHeader.opaque"); 

      setBackground(background); 
      setForeground(foreground); 
      setFont(font); 
      setOpaque(opaque); 

      return this; 
     }  
    } 
} 
+0

Концепция рендереров работает для Nimbus без ограничений, но не для JTableHeader, лично никогда не пробовал, один из кода от @kleopatra (опять же в power_save_mode) – mKorbel

+0

Я пробовал это. Это был второй блок кода выше. – Dodd10x

+0

@ Dodd10x Это смешно, потому что это сработало для меня – MadProgrammer