Заполнение JTable инициализированными столбцамиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Заполнение JTable инициализированными столбцами

Сообщение Anonymous »

Предположим, у вас есть JTable (который может содержать или не содержать строки) с уже добавленными столбцами настраиваемого типа.

Код: Выделить всё

            JTable table = new JTable(); // actually, a custom JTable type, but it's not the point
// we can't rely on auto-created columns and add them with table.addColumn()
table.addColumn(TableColumns.code());
table.addColumn(TableColumns.name());
Вы получаете коллекцию объектов данных домена для заполнения таблицы.
Каков правильный способ вставки строк, желательно без дублирования имен столбцов или количества столбцов, как показано во фрагменте ниже?

Код: Выделить всё

    private static void fillTable() {
List doctors = createDoctors();
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);
// --------- duplication, bad -------------
model.setColumnCount(2);
model.setColumnIdentifiers(new Object[]{"Code", "Name"});
// ----------------------------------------
for (Doctor doctor : doctors) {
String code = doctor.getCode();
String name = doctor.getName();
model.addRow(new Object[]{code, name});
}
}
Я могу удалить дублирующуюся часть и заставить ее работать, но это сделает метод инициализации таблицы более сложным и трудным для понимания. Не оптимально.

Код: Выделить всё

    private static Component createTable() {
// you can adjust table initialization if necessary
table = new JTable() {
@Override
public void addColumn(TableColumn aColumn) {
// important to avoid out-of-bounds exceptions during rendering
aColumn.setModelIndex(getColumnCount());
super.addColumn(aColumn);
}
};
table.setAutoCreateColumnsFromModel(false);
List columns = Arrays.asList(TableColumns.code(), TableColumns.name());
columns.forEach(table::addColumn);
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setColumnCount(table.getColumnCount());
model.setColumnIdentifiers(columns.stream().map(TableColumn::getIdentifier).toArray());
return table;
}
Обратите внимание, что абсолютно невозможно создать собственный тип модели для каждого доменного класса, поскольку у нас их масса (GPT предлагает DoctorTableModel).
Полная демонстрация:

Код: Выделить всё

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.util.ArrayList;
import java.util.List;

public class SimpleTableDemo {

static JTable table;
static JButton fillButton;
static JButton clearButton;

public static void main(String[] args) {
Container mainPanel = createMainPanel();
JFrame frame = new JFrame("Table Demo");
frame.setContentPane(mainPanel);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}

private static Container createMainPanel() {
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(createScroller());
mainPanel.add(createButtonPanel(), BorderLayout.SOUTH);
return mainPanel;
}

private static Component createScroller() {
JScrollPane scroller = new JScrollPane();
scroller.setViewportView(createTable());
return scroller;
}

private static Component createTable() {
// you can adjust table initialization if necessary
table = new JTable();
table.addColumn(TableColumns.code());
table.addColumn(TableColumns.name());
return table;
}

private static Component createButtonPanel() {
// you can adjust table initialization if necessary
JPanel panel = new JPanel();
panel.add(createFillButton());
panel.add(createEmptyButton());
return panel;
}

private static Component createFillButton() {
fillButton = new JButton("Fill");
fillButton.addActionListener(e -> fillTable());
fillButton.addActionListener(e -> {
fillButton.setEnabled(false);
clearButton.setEnabled(true);
});
return fillButton;
}

private static Component createEmptyButton() {
clearButton = new JButton("Clear");
clearButton.setEnabled(false);
clearButton.addActionListener(e -> clearTable());
clearButton.addActionListener(e -> {
clearButton.setEnabled(false);
fillButton.setEnabled(true);
});
return clearButton;
}

private static void fillTable() {
List doctors = createDoctors();
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);
// --------- duplication, bad -------------
model.setColumnCount(2);
model.setColumnIdentifiers(new Object[]{"Code", "Name"});
// ----------------------------------------
for (Doctor doctor : doctors) {
String code = doctor.getCode();
String name = doctor.getName();
model.addRow(new Object[]{code, name});
}
}

private static List createDoctors() {
List  doctors = new ArrayList();
doctors.add(Doctor.of("1", "Maria"));
doctors.add(Doctor.of("2", "Patrick"));
return doctors;
}

private static void clearTable() {
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);
}
}

Код: Выделить всё

public class Doctor {

private String code;
private String name;

private Doctor() {
}

public static Doctor of(String code, String name) {
Doctor doctor = new Doctor();
doctor.code = code;
doctor.name = name;
return doctor;
}

public String getName() {
return name;
}

public String getCode() {
return code;
}
}

Код: Выделить всё

import javax.swing.table.TableColumn;

// for simplicity, no custom TableColumn types are used here
public class TableColumns {

private TableColumns() {
}

public static TableColumn code() {
TableColumn column = new TableColumn();
column.setIdentifier("CODE");
column.setHeaderValue("Code");
return column;
}

public static TableColumn name() {
TableColumn column = new TableColumn();
column.setIdentifier("NAME");
column.setHeaderValue("Name");
return column;
}
}
Java 8.


Подробнее здесь: https://stackoverflow.com/questions/798 ... ed-columns
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»