Как добавить JXDatepicker для столбца JTable

Я использую JTable. Там у меня есть столбец Date, где мне нужно, чтобы JXDatePicker появлялся, когда я нажимаю на ячейку, чтобы я мог выбрать из нее дату.

Может ли кто-нибудь показать мне, как это сделать?

Спасибо! в ожидании ответа..


person Sumudu    schedule 06.08.2012    source источник


Ответы (4)


Вероятно, вам следует использовать DatePickerCellEditor, который представляет собой CellEditor с использованием JXDatePicker в качестве компонента редактора. Например:

TableColumn dateColumn = table.getColumnModel().getColumn(columnIndex);
dateColumn.setCellEditor(new DatePickerCellEditor());

Вот демонстрационная таблица:

import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableColumn;

import org.jdesktop.swingx.table.DatePickerCellEditor;

public class DateColumnDemo {

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("DateColumnDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTable table = new JTable(new Object[][] { { "1", new Date() } },
                new Object[] { "Id", "Time" });

        TableColumn dateColumn = table.getColumnModel().getColumn(1);
        dateColumn.setCellEditor(new DatePickerCellEditor());

        JScrollPane scrollPane = new JScrollPane(table); 

        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
person tenorsax    schedule 06.08.2012
comment
Да, спасибо, все работает! (Хотя теперь у меня осталась пара новых вопросов.) - person Sumudu; 06.08.2012
comment
Для этого типа используйте какую таблицу вы предлагаете, JTable или JXTable? Я надеюсь добавить некоторые удобные функции. И в моей таблице было около 25 столбцов. Нет ограничений на количество строк ... очень ценю любые советы .. @Max - person Sumudu; 06.08.2012
comment
@Anubis, в зависимости от того, какую функциональность вы хотите добавить, я бы, вероятно, предложил JXTable, так как, среди прочего, у него действительно хороший API для подсветки, IMHO - person MadProgrammer; 06.08.2012
comment
@MadProgrammer, я следую ответу Макса. У меня там небольшая проблема. подборщик работает нормально. Но не могу понять, как изменить его формат. Мне нужен формат «дд-МММ-гггг», но он показывает что-то вроде «Среда, 01 августа, 00:00:00 IST 2012». Я изменил формат DatePickerCellEditors, да, он что-то делает, он показывает в соответствии с установленным форматом только тогда, когда я нажимаю на ячейку. После того, как ячейка потеряет фокус, ячейка показывает это громоздкое значение. Любая помощь.. - person Sumudu; 06.08.2012
comment
@Anubis, вам нужно предоставить CellRenderer, способный форматировать значение Date так, как вы этого хотите. Ознакомьтесь с разделом Использование пользовательских средств визуализации docs.oracle.com/javase. /tutorial/uiswing/components/. Вы используете тот же базовый подход к editors, чтобы применить renderers (вместо этого просто используйте методы renderer) - person MadProgrammer; 06.08.2012
comment
@Anubis относительно формата рендеринга: JXTable использует разумный (зависящий от локали) формат по умолчанию для рендеринга. Если это не так, ваша tableModel не возвращает класс Date для столбца. - person kleopatra; 06.08.2012
comment
Я запустил этот пример кода (спасибо, @tenorsax), и он сработал, как и ожидалось. Но если я изменю размер окна, изменив таким образом ширину столбцов, средство выбора даты перестанет работать. Выбор даты с помощью пользовательского интерфейса оставляет дату прежней. Кто-нибудь видел такое поведение? - person Rob Scala; 24.05.2016
comment
Оказывается, когда столбец таблицы шире окна выбора даты, он не работает. Он работает с более узкой колонкой. - person Rob Scala; 24.05.2016
comment
Я решил это, вызвав setLightWeightPopupEnabled(false) в JXDatePicker. - person Rob Scala; 24.05.2016

Как уже упоминалось в моем комментарии к правильному ответу Макса:

JXTable (такой же, как обычный JTable) делает форматирование значения даты по умолчанию, используя формат, возвращенный DateFormat.getInstance(). Если форматирование не работает, обычно это неполная реализация tableModel: средство визуализации по умолчанию для определенного типа используется только тогда, когда columnClass возвращает этот конкретный тип.

// in your TableModel, implement getColumnClass
@Override
public Class<?> getColumnClass(int columnIndex) {
    if (columnIndex == myDateColumnIndex) {
        return Date.class;
    }
    ...
}

Чтобы установить средство визуализации даты с настраиваемым форматом, создайте экземпляр DefaultTableRenderer с соответствующим значением FormatStringValue и сообщите таблице, чтобы использовать его (либо для каждого столбца, работает с любым классом столбцов или для каждой таблицы, работает для столбцов, возвращающих класс Date)

StringValue sv = new FormatStringValue(new SimpleDateForma("dd-MMMM-yyyy"));
TableCellRenderer r = new DefaultTableRenderer(sv);
// either per-column
table.getColumn(dateColumnIndex).setCellRenderer(r);
// or per-table
table.setDefaultRenderer(Date.class, r);
person kleopatra    schedule 06.08.2012
comment
Большое спасибо @kleopatra за подробное объяснение. Никогда не знал, как использовать этот public Class<?> getColumnClass(int columnIndex){...} метод. Ваш ответ стал очень полезным.. - person Sumudu; 07.08.2012

Вы можете предоставить редактор ячеек таблицы по умолчанию для класса Date (при условии, что столбец использует Date)

Ознакомьтесь с setDefaultEditor, чтобы узнать подробности.

Это, как правило, немного тяжело, поэтому вы можете использовать JTable.getColumnModel().getColumn(int).setCellEditor(editor), чтобы указать редактор, который будет использоваться для данного TableColumn

Ознакомьтесь с разделом Как использовать таблицы (используя другие редакторы) для подробнее

person MadProgrammer    schedule 06.08.2012
comment
Спасибо @MadProgrammer, вы уже помогли мне. Я предполагаю, что мой выбранный ответ - Хорошо. не так ли? - person Sumudu; 06.08.2012
comment
@Anubis, конечно, ответ Макса хорошо расширен и содержит примеры (я даже дал ему +1;)) - person MadProgrammer; 06.08.2012

Вы можете добавить DatePicker в JTable (или в JXTable), добавив в свою таблицу «Редактор таблиц». Редактор таблиц — это любой класс, реализующий интерфейс «javax.swing.table.TableCellEditor». Вы можете сделать это с помощью компонента JXDatePicker, как описано выше, или с помощью файла LGoodDatePicker, как показано здесь. (Это альтернативное решение той же проблемы.)

Справедливое раскрытие информации: я являюсь основным разработчиком LGoodDatePicker.

Библиотека LGoodDatePicker включает три класса TableEditor. Эти классы позволяют программисту добавлять DatePicker, TimePicker или DateTimePicker в ячейки Swing JTable (или в SwingX JXTable).

Классы сборщиков также можно добавлять к обычным поворотным панелям или другим поворотным контейнерам.

Вот пример того, как добавить DateTimePicker в ваш JTable:

// Create a table.
JTable table = new JTable(new DemoTableModel());

// Add the DateTimeTableEditor as the default editor and renderer for
// the LocalDateTime data type.
table.setDefaultEditor(LocalDateTime.class, new DateTimeTableEditor());
table.setDefaultRenderer(LocalDateTime.class, new DateTimeTableEditor());

// Explicitly set the default editor and renderer for column index 0.
TableColumn column = table.getColumnModel().getColumn(0);
column.setCellEditor(table.getDefaultEditor(LocalDateTime.class));
column.setCellRenderer(table.getDefaultRenderer(LocalDateTime.class));

Вот руководство по Oracle о том, как использовать табличные редакторы.

Я вставил скриншоты ниже с демонстрацией редактора таблиц, компонентов средства выбора и полной демонстрации. Обратите внимание, что библиотека LGoodDatePicker включает отдельную демонстрацию для редакторов таблиц. Он находится в репозитории в этой папке: "LGoodDatePicker/Project/src/main/java/com/github /lgooddatepicker/demo/TableEditorsDemo.java".

Библиотеку можно установить в ваш Java-проект с страницы выпуска проекта.

Домашняя страница проекта находится на Github по адресу:
https://github.com/LGoodDatePicker/LGoodDatePicker .

. Скриншот демонстрации редакторов таблиц

Скриншоты Date and TimePicker

Снимок экрана полной демонстрации

person BlakeTNC    schedule 01.07.2016