2012-01-31 3 views
0

У меня есть таблица с тремя столбцами, первая колонка является специальной и содержит флажок вместо заголовка.Пользовательский Jtable Header имеет разную компоновку, тогда другие заголовки

Проблема заключается в том, что макет (принадлежность) заголовка флажка отличается от других заголовков. Может ли кто-нибудь помочь?

Кодекс:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 
import java.awt.event.*; 

public class JTableHeaderCheckBox 
{ 
    Object colNames[] = {"", "String", "String"}; 
    Object[][] data = {}; 
    DefaultTableModel dtm; 
    JTable table; 
    public void buildGUI() 
    { 
    dtm = new DefaultTableModel(data,colNames); 
    table = new JTable(dtm); 
    for(int x = 0; x < 2; x++) 
    { 
     dtm.addRow(new Object[]{new Boolean(false),"Row "+(x+1)+" Col 2","Row "+(x+1)+" Col 3"}); 
    } 
    JScrollPane sp = new JScrollPane(table); 
    TableColumn tc = table.getColumnModel().getColumn(0); 
    tc.setCellEditor(table.getDefaultEditor(Boolean.class)); 
    tc.setCellRenderer(table.getDefaultRenderer(Boolean.class)); 
    tc.setHeaderRenderer(new CheckBoxHeader()); 
    JFrame f = new JFrame(); 
    f.getContentPane().add(sp); 
    f.pack(); 
    f.setLocationRelativeTo(null); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
    } 

    public static void main (String[] args) 
    { 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
     new JTableHeaderCheckBox().buildGUI(); 
     } 
    }); 
    } 
} 

class CheckBoxHeader extends JCheckBox implements TableCellRenderer { 
    protected CheckBoxHeader rendererComponent; 
    protected int column; 

    public CheckBoxHeader() { 
     rendererComponent = this; 
    } 

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     setColumn(column); 
     return rendererComponent; 
    } 

    protected void setColumn(int column) { 
     this.column = column; 
    } 
    public int getColumn() { 
     return column; 
    }  
} 

Выход странно:

enter image description here

UPDATE:
Что я хочу:

  1. Центр выровнять флажок в заголовке
  2. Если вы обратите внимание, то обратите внимание на фон флажка Header (, кажется, появляются на внутренней) отличается от 2 других заголовков (они, кажется, выскакивают)

ответ

3

Если вы имеете в виду границы флажка вы можете попробовать это сделать внешний вид заголовка более последователен:

public CheckBoxHeader() { 
    rendererComponent = this; 

    setHorizontalAlignment(JLabel.CENTER); 
    setBorderPaintedFlat(true); 
    setBorderPainted(true); 
} 
+0

Я проверю это завтра, так как я сейчас не работаю :) –

+0

Хорошо, теперь граница прекрасна. Как установить ** выравнивание по центру ** в заголовке таблицы? Если вы ответите на это, я приму ваш ответ. –

+0

Я изменил ваш ответ, чтобы добавить решение для выравнивания по центру. Спасибо за Ваш ответ –

3

TableCellRenderer возвращает JLabel/JComponents и эти JComponents haven't got implemented any LayoutManager, но не любые restictions для установки некоторых LayoutManagers

+0

так как я могу воспроизвести эффект других заголовков таблиц (String, String)? –

+0

Если вы говорите, что я должен установить макет, могу ли я спросить, как я могу получить макет, используемый для других 2 заголовков? –

+0

hehehe хороший вопрос, это только о том, что вы поставили JComponent в TableHeader/Cell. – mKorbel

Смежные вопросы