Пользовательский заголовок Jtable отличается от других заголовков - PullRequest
1 голос
/ 31 января 2012

У меня есть таблица с 3 столбцами, первый столбец является специальным и вместо заголовка содержит флажок.

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

Код:

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

ОБНОВЛЕНИЕ:
Что я хочу:

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

Ответы [ 2 ]

4 голосов
/ 31 января 2012

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

public CheckBoxHeader() {  
    rendererComponent = this;  

    setHorizontalAlignment(JLabel.CENTER);
    setBorderPaintedFlat(true);
    setBorderPainted(true);
}  
3 голосов
/ 31 января 2012

TableCellRenderer возвращает JLabel/JComponents, и эти JComponents не реализовали никакой LayoutManager , но нет никаких ограничений для установки некоторых из LayoutManagers

...