Настройка горизонтального выравнивания столбца JTable без использования DefaultTableCellRenderer

У меня есть следующий TableCellRenderer (НЕ DefaultTableCellRenderer), который позволяет мне пропускать строки в ячейках JTable:

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;

public class MyCellRenderer extends JTextArea implements TableCellRenderer {

  Color highlightBackground = (Color) UIManager.get("Table.selectionBackground");

  public MyCellRenderer() {
    setLineWrap(true);
    setWrapStyleWord(true);
  }

  @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    setText((String) value); //or something in value, like value.getNote()...
    setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height);
    if (table.getRowHeight(row) != getPreferredSize().height) {
      table.setRowHeight(row, getPreferredSize().height);
    }
    if (table.isRowSelected(row)) {
      this.setBackground(highlightBackground);
    } else {
      this.setBackground(Color.WHITE);
    }
    return this;
  }
}

Я просто хотел бы изменить горизонтальное выравнивание этого средства визуализации. (Это означает, что в ячейках будет текст в центре или справа, сейчас он слева).

Вот как я использую этот TableCellRenderer:

Table.getColumnModel().getColumn(1).setCellRenderer(new MyCellRenderer());

введите здесь описание изображения


person Elio    schedule 21.01.2016    source источник
comment
что вы подразумеваете под горизонтальным выравниванием рендерера? Вы имеете в виду выравнивание ячеек?   -  person SomeDude    schedule 21.01.2016
comment
Нет необходимости вызывать setSize, JTable сделает это сам. Изменить выравнивание на что?   -  person MadProgrammer    schedule 22.01.2016


Ответы (2)


Я нашел ответ, спасибо TT. для подсказок я просто удалил пользовательский конструктор и его перенос строки, расширил JTextPane и добавил несколько строк кода. Для тех, кому нужен класс, который позволяет пропускать строки и устанавливать горизонтальное выравнивание ячеек, вот код:

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class MyCellRenderer extends JTextPane implements TableCellRenderer {

Color highlightBackground = (Color) UIManager.get("Table.selectionBackground");

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    setText((String) value);//or something in value, like value.getNote()...
    setSize(table.getColumnModel().getColumn(column).getWidth(),
            getPreferredSize().height);
    if (table.getRowHeight(row) != getPreferredSize().height) {
        table.setRowHeight(row, getPreferredSize().height);
    }
    if (table.isRowSelected(row)) {
        this.setBackground(highlightBackground);
    } else {
        this.setBackground(Color.WHITE);
    }

    //Added lines
    StyledDocument doc = this.getStyledDocument();
    SimpleAttributeSet center = new SimpleAttributeSet();
    StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
    doc.setParagraphAttributes(0, doc.getLength(), center, false);
    //Added Lines

    return this;
}
}
person Elio    schedule 22.01.2016

Невозможно сделать это с JTextArea.

Вместо этого ваш модуль визуализации ячеек должен расширять JTextPane, чтобы вы могли вызывать из своей реализации getTableCellRendererComponent или конструктора модуля визуализации:

StyledDocument doc = getStyledDocument();
SimpleAttributeSet center = new SimpleAttributeSet();
StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
doc.setParagraphAttributes(0, doc.getLength(), center, false);

Если вы хотите центр. Бессовестно подключен к этому ответу на StackOverflow.

person TT.    schedule 21.01.2016
comment
Это будет работать только для JTextPane, а не для JTextArea. - person camickr; 21.01.2016
comment
@camickr Hmz хорошая мысль =) так что вернемся к setAlignmentY, я полагаю - person TT.; 21.01.2016
comment
@camickr Вы получили EXP в подобных вещах, глядя на свой профиль пользователя ... Как вы думаете, JTextArea будет хорошим компонентом для расширения, или ему лучше расширить JTextPane? - person TT.; 21.01.2016
comment
Не уверен, что действительно понимаю, что пытается сделать ОП, поэтому у меня нет предложения. - person camickr; 21.01.2016
comment
setAlignmentY не работает (как и setAlignmentX) - person Elio; 22.01.2016
comment
Рассматривали ли вы возможность использования другого элемента управления, например JTextPane? Я думаю, что JTextArea слишком примитивен, чтобы можно было настроить выравнивание. Попробуйте. Если вы считаете, что можете использовать JTextPane, а не JTextArea, я верну свой ответ к предыдущему (в котором есть решение для установки для него выравнивания). - person TT.; 22.01.2016
comment
Посмотрите на этот поток на SO, который также предполагает, что это невозможно с JTextArea. Подумайте о переходе на JTextPane. Это немного сложнее, чем JTextArea, но, по крайней мере, вы можете установить для него выравнивание. - person TT.; 22.01.2016
comment
Вы очень кстати. В итоге вы использовали JTextPane? - person TT.; 22.01.2016
comment
Да, я записал решение. - person Elio; 22.01.2016
comment
Ответ @Elio отменен и предоставил текст, в котором говорится, что вы не можете сделать это с помощью JTextArea. ГЛ! - person TT.; 22.01.2016