2013-12-03 3 views
0

Я нашел способ выделить ячейку в таблице, которая, кажется, быть ComponentИзменить выравнивание текста в JTable ячейки

JTable table = new JTable(...) 
{ 
    public Component prepareRenderer(
     TableCellRenderer renderer, int row, int column) 
    { 
     Component c = super.prepareRenderer(renderer, row, column); 

     // add custom rendering here 

     return c; 
    } 
}; 

В коде c это компонент, но я не могу найти метод в Component для изменения выравнивания текста. Что-то не так в этом отношении?

ответ

2

Использование DefaultTableCellRenderer на эти цели, оно имеет setHorizontalAlignment() метод:

DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(){ 
    @Override 
    public Component getTableCellRendererComponent(JTable arg0,Object arg1, boolean arg2, boolean arg3, int arg4, int arg5) { 
     Component tableCellRendererComponent = super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5); 
     int align = DefaultTableCellRenderer.CENTER; 
     if(condition){ 
      align = DefaultTableCellRenderer.LEFT; 
     } 
     ((DefaultTableCellRenderer)tableCellRendererComponent).setHorizontalAlignment(align); 
     return tableCellRendererComponent; 
    } 
}; 
t.getColumnModel().getColumn(COLUMN).setCellRenderer(renderer); 

COLUMN является целевой столбец, condition является условием для переключения.

+0

Можно ли применить подход к отдельным ячейкам, а не ко всему столбцу или строке? – bijiDango

2

(J)Component нету этот метод (ов), реализованный в API

есть два способа

  1. литье (J)Component к JLabel

  2. установить это значение для class под управлением getColumnClass

.

DefaultTableCellRenderer stringRenderer = (DefaultTableCellRenderer) 
    table.getDefaultRenderer(String.class); 
stringRenderer.setHorizontalAlignment(SwingConstants.CENTER); 
+0

Мне не удалось выполнить (JLabel) c. ** '. Затмение меня отвергло. Любая подсказка? – bijiDango

+0

вы можете использовать два способа: 'JLabel label = (JLabel) c;' в качестве следующей строки и из 'Компонент c = super.prepareRenderer (renderer, row, column);', затем 'возвращает метку' вместо' return c; ', 2 лить внутри кода, когда это действительно необходимо' ((JLabel) c) .setHorizontalAlignment (SwingConstants.CENTER); 'остаток' prepareRenderer' остается неизменным – mKorbel

+0

Я пробовал ваш код, кажется, я не могу отличить 'c' на 'JLabel', при этом его использование в« DefaultTableCellRenderer »возможно. – bijiDango

0

Я собираюсь сделать вывод.

Для этой specifiec проблемы, мы можем разделить его на две части:

  1. выделить ячейку
  2. agjust его выравнивании

Чтобы выделить ячейку, мой первоначально путь и путь alex2410 должен будут полезны.

JTable table = new JTable(...) 
{ 
    public Component prepareRenderer(
     TableCellRenderer renderer, int row, int column) 
    { 
     Component c = super.prepareRenderer(renderer, row, column); 

     // add custom rendering here 

     return c; 
    } 
}; 

другой

DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(){ 
    @Override 
    public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component c = super.getTableCellRendererComponent(arg0, arg1, arg2, arg3, arg4, arg5); 

     // add custom rendering here 

     return c; 
    } 
}; 
t.getColumnModel().getColumn(COLUMN).setCellRenderer(renderer); 

И для выравнивания, единственный метод, который я нашел полезным является:

((DefaultTableCellRenderer)c).setHorizontalAlignment(SwingConstants.center); 

В предложении mKorbel, вы можете кастовал Component с к JLabel, но мне не удалось к тому.

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