Части даты выравнивания в столбце JTable, отформатированные в пропорциональном шрифте

Мне нужно, чтобы части даты (дд, мммм, гггг) были выровнены по вертикали. Я задал вопрос в Фиксированная длина месяца и дня в формате даты ? для вставки дополнительных букв, но я обнаружил, что это не помогает в случае пропорционального шрифта (ширина букв разная). Например, со шрифтом Lucida Fax:

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


person Loc Phan    schedule 29.06.2011    source источник
comment
Вопрос в том, как сделать столбец даты с вертикально выровненными частями даты? Как вы можете видеть на прикрепленных изображениях, год не выровнен, потому что ширина месяца отличается.   -  person Loc Phan    schedule 29.06.2011


Ответы (3)


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

TableColumnModel m = myTable.getColumnModel();
m.getColumn(5).setCellRenderer(new SubstDateRenderer());

здесь вы можете установить BackGround, ForeGround для TableCell

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.table.DefaultTableCellRenderer;

public class SubstDateRenderer extends DefaultTableCellRenderer {

    private static final long serialVersionUID = 1L;
    private Date dateValue;
    private SimpleDateFormat sdfNewValue = new SimpleDateFormat("dd.MMMM.yyyy");
    private String sdfNewValueString = "";

    public SubstDateRenderer() {// formating TableCell
        super();
        setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    }

    @Override
    public void setValue(Object value) {
        if ((value != null) && (value instanceof Date)) {
            dateValue = (Date) value;
            sdfNewValueString = sdfNewValue.format(dateValue);
            value = sdfNewValueString;
        }
        super.setValue(value);
    }
}
person mKorbel    schedule 29.06.2011
comment
Извините, я не понимаю этот ответ. Этот код создает TableCellRenderer для типа даты. В результате получаются тексты с выравниванием по центру. Мне нужно, чтобы части даты (дд, мм, гггг) были выровнены по вертикали. Вы можете видеть на прикрепленном изображении, годы не совпадают. - person Loc Phan; 29.06.2011
comment
Вы пытались собрать ColumnRenderer с потоками, на которые вы ссылаетесь, на которые вы ссылаетесь в своем вопросе, для меня работает вместе, и с синтаксисом Html тоже - person mKorbel; 29.06.2011
comment
хммм, может быть, мой навахо ‹› английский, поместите Html-код/синтаксис в TableCell, TableCell по умолчанию возвращает JLabel, а JLabel — лучший из JComponents для любого из возможных ZOO :-) - person mKorbel; 29.06.2011

Как предложил @mKorbel, подходящий TableCellRenderer является правильным выбором, но вам, возможно, придется переопределить paintComponent() и отобразить текст с использованием графического контекста FontMetrics, как показано здесь.

Если числовые месяцы допустимы, большинство шрифтов с пропорциональным интервалом дают глифам цифр такое же постоянное смещение.

person trashgod    schedule 29.06.2011

Спасибо за ваши ответы. Я нашел для себя решение, которое использует JTextPane в качестве TableCellRenderer, затем определяет значения табуляции и использует вкладки в дате форматирования. Кажется, это нормально для моего требования, а также имеет другие функции обычного текстового поля, такие как перенос слов...

person Loc Phan    schedule 02.07.2011