Создавайте таблицы напрямую, используя класс JTable
Создайте форму:
В дополнение к конструктору по умолчанию класс JTable также предоставляет конструктор для создания таблицы с использованием указанного массива имен столбцов таблицы и массива данных таблицы, как показано ниже:
JTable(Object[][] rowData,Object[] columnNames)
- rowData — массив данных таблицы
- columnNames — это массив имен столбцов таблицы.
При использовании таблицы она обычно добавляется на панель прокрутки, а затем панель прокрутки добавляется в соответствующую позицию.
JTable также предоставляет метод построения для создания таблицы с использованием вектора имени столбца и вектора данных таблицы указанной таблицы следующим образом:JTable(Vector rowData,Vector columnNames)
- rowDara — вектор данных таблицы
- columnNames — вектор имени столбца таблицы
При использовании таблицы иногда вся таблица может отображаться в форме без использования полосы прокрутки, в этом случае таблица также может быть напрямую добавлена в соответствующий контейнер.
Примечание. Если вы добавляете таблицу в соответствующий контейнер, вам необходимо передать класс JTablegetTableHeader()
Метод получает объект класса JTableHeader, а затем добавляет объект в соответствующую позицию контейнера, иначе в таблице не будет имен столбцов.
Простой настольный случай:
package view.flight;
import javax.swing.*;
import java.awt.*;
/**
* @author: 我的袜子都是洞
*/
public class TestGui extends JFrame {
// 列名
String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"};
// 表格具体数据
String[][] columnDate = new String[][]{
{"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"},
{"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},
{"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},
{"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"},
};
JTable table = new JTable(columnDate, columnName);
TestGui(String title) {
super(title);
init();
setComponent ();
addComponent();
addListener();
setVisible(true);
}
private void init () {
setSize(600, 400);
// 设置窗口位置居中
setLocationRelativeTo(null);
// 设置布局
setLayout(new BorderLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void setComponent () {
// 设置第一列宽度为40
table.getColumnModel().getColumn(0).setPreferredWidth(40);
// 设置第二列宽度为120
table.getColumnModel().getColumn(1).setPreferredWidth(120);
}
private void addComponent () {
// 使用srcllpane会自动显示列名
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
}
private void addListener () {
}
public static void main(String[] args) {
new TestGui("JTable演示");
}
}
пользовательская форма
После того, как таблица создана, ей требуется ряд определений, соответствующих конкретному использованию. По умолчанию вы можете редактировать ячейку, дважды щелкнув ее.Если вам не нужна эта функция, вы можете реорганизовать класс JTableisCellEditable(int row,int column)
Реализация метода Этот метод возвращает логическое значение true, указывающее, что его можно редактировать, в противном случае он возвращает false, чтобы указать, что его нельзя редактировать.
Доступно через s класса JTableHeaderetReorderingAllowed(boolean reorderAllowed)
Метод устанавливает, поддерживает ли таблица функцию перестановки.Этот метод возвращает логическое значение true, чтобы указать поддержку, и false, чтобы указать отсутствие поддержки.
По умолчанию содержимое ячейки отображается слева, если вам нужно отцентрировать его, вы можете провести рефакторинг класса JTable.getDefaultRenderer(Class<?> columnClass)
метод достижения.
Пофакторированный код:
public TableCellRenderer getDefaultRenderer(Class<?> columnClass) {
DefaultTableCellRenderer cr=(DefaultTableCellRenderer)super.getDefaultRenderer(columnClass);
cr.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
return cr;
}
Общие методы класса JTable, используемые для определения таблиц
-
setRowHeight(int rowHeight)
: Установите высоту строки таблицы, по умолчанию 16 пикселей. -
setRowSelectionAllowed(boolean sa)
: Установите, разрешать ли выбор строк таблицы, по умолчанию разрешается выбор, значение false означает, что выбор не разрешен. -
setSelectionMode(int sm)
: Установите режим выбора строки таблицы. -
setSelectionBackground(Color cr)
: установить цвет фона выбранной строки в таблице. -
setSelectionForeground(Color fc)
: установить цвет переднего плана выбранной строки в таблице. -
setAutoResizeMode(int mode)
: Установите режим автоматической настройки стола.
с использованиемsetSelectionMode(int sm)
Когда метод устанавливает режим выбора строки таблицы, ее входной параметр выбирается из статических констант ListSelectionModel. следующее:
- Статическая константа: SINGLE_SELECTION, значение константы: 0, что означает, что выбран только один.
- Статическая константа: SINGLE_INTERVAL_SELECTION, значение константы: 1, указывающее, что разрешено несколько последовательных выборов.
- Статическая константа: MULTIPLE_INTERVAL_SELECTION, значение константы: 2, что означает выбор более одного по желанию
с использованиемsetAutoResizeMode(int mode)
Когда метод устанавливает режим автоматической настройки таблицы, ее входные параметры выбираются из статических констант класса JTable.
Примечание. Режим автоматической настройки таблицы заключается в том, что общая ширина таблицы остается неизменной при изменении ширины столбца таблицы.
Манипулировать таблицей
При написании приложения часто бывает необходимо получить некоторую информацию о таблице.Ниже приведены три метода в классе JTable, которые часто используются для получения информации о таблице.
-
getRowCount()
: получить количество строк в таблице, возвращаемое значение — int. -
getColumnCount()
: получить количество столбцов в таблице, возвращаемое значение — int. -
getColumnName(int column)
: получить имя столбца в указанной позиции индекса, а возвращаемое значение — String.
Методы, которые часто используются в классе JTable для управления выбранными строками таблицы, следующие:
-
setRowSelectionInterval(int from,int to)
: выбирает все строки с индексом строки от до до (включая строки с индексом от до до) -
addRowSelectionInterval(int from,int to)
: Добавляет все строки с индексом строки от до до как выбранные строки таблицы -
isRowSelected(int row)
: проверьте, выбрана ли строка с индексом строки. -
selectAll()
: выбирает все строки в таблице -
clearSelection()
: отменить выбор всех выбранных строк -
getSelectedRowCount()
: получить количество выбранных строк, возвращаемое значение имеет тип int, если нет выбранной строки, вернуть -1 -
getSelectedRow()
: Получить наименьшее значение индекса в выбранной строке, возвращаемое значение имеет тип int, если нет выбранной строки, вернуть -1 -getSelectedRows()
: получить значение индекса всех выбранных строк, возвращаемое значение представляет собой массив int.
Табличные модели и таблицы
Интерфейс TableModel определяет табличную модель, абстрактный класс AbstractTableModel реализует большинство методов интерфейса TableModel, и только следующие три абстрактных метода не реализованы.
public int getRowCount()
public int getColumnCount()
public Object getValueAt(int rowIndex,int columnIndex)
Наследуя AbstractTableModel, вы можете реализовать три вышеупомянутых абстрактных метода для создания собственного класса модели таблицы. Класс DefaultTableModel — это класс модели таблицы, предоставляемый классом Swing, который наследует класс AbstractTableModel и реализует три вышеупомянутых абстрактных метода.
Начиная с JDK1.6 предусмотрена функция сортировки таблицы. Через класс JTablesetRowSorter(RowSorter<? extends TableModel> sorter)
метод установки сортировщика для таблицы. Класс TableRowSorter — это класс сортировки, предоставляемый Swing.Код для установки сортировщика для таблицы выглядит следующим образом:
DefaultTableModel tableModel=new DefaultTableModel();
JTable table=new JTable(tableModel);
table.setRowSorter(new TableRowSorter(tableModel));
При использовании табличного сортировщика обычно нужно задать для него табличную модель, один из способов — через конструкторTableRowSorter(TableModel model)
, другой способsetModel(TableModel model)
Метод устанавливает модель таблицы для сортировщика таблиц.
Ведение табличных моделей
При использовании таблицы необходимо часто поддерживать содержимое таблицы, например добавлять новую строку данных в таблицу, изменять значение ячейки в таблице, удалять строку данных из таблицы и т. д. Эти операции можно поддерживать, поддерживая табличную модель.
Возможны две ситуации при добавлении новых строк данных в табличную модель: одна — добавить в конец табличной модели, а другая — добавить в индекс, заданный табличной моделью, соответственноaddRow(Object[] rowData)
иinsertRow(int row,Object[] rowData)
илиaddRow(Vector rowData)
иinsertRow(int row,Vector rowData)
реализация метода.
Если вам нужно изменить данные ячейки в модели таблицы, вы можете использовать методsetValueAt(Object aValue,int row,int column)
Done, где aValue — измененное значение, доступ к которому можно получить с помощьюgetValueAt(int row,int column)
Получить значение ячейки, метод возвращает тип объекта.
Если вам нужно удалить данные строки в модели таблицы, вы можете использовать методremoveRow(int row)
для завершения, где строка — это индекс удаляемой строки.
Используйте случай модели TableModel:
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
/**
* @author: 我的袜子都是洞
*/
public class TestGui extends JFrame {
JTable table = new JTable(new FlightTableModel());
TestGui(String title) {
super(title);
init();
setComponent ();
addComponent();
addListener();
setVisible(true);
}
private void init () {
setSize(600, 400);
// 设置窗口位置居中
setLocationRelativeTo(null);
// 设置布局
setLayout(new BorderLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void setComponent () {
// 设置第一列宽度为40
table.getColumnModel().getColumn(0).setPreferredWidth(40);
// 设置第二列宽度为120
table.getColumnModel().getColumn(1).setPreferredWidth(120);
}
private void addComponent () {
// 使用srcllpane会自动显示列名
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
}
private void addListener () {
}
public static void main(String[] args) {
new TestGui("JTable演示");
}
}
class FlightTableModel extends AbstractTableModel {
// 列名
String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"};
// 表格具体数据
String[][] flightDate = new String[][]{
{"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"},
{"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},
{"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},
{"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"},
};
/**
* 返回一共多少行
*/
@Override
public int getRowCount() {
return flightDate.length;
}
/**
* 返回一共多少列
*/
@Override
public int getColumnCount() {
return columnName.length;
}
/**
* 返回每一个单元格的值
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return flightDate[rowIndex][columnIndex];
}
/**
* 获取每一列的名称
*/
@Override
public String getColumnName(int column) {
return columnName[column];
}
/**
* 单元格是否可以修改
*/
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
}
Эффект:
Пример получения соответствующих данных путем прослушивания выбранной ячейки:
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
/**
* @author: 我的袜子都是洞
*/
public class TestGui extends JFrame {
FlightTableModel flight = new FlightTableModel();
JTable table = new JTable(flight);
TestGui(String title) {
super(title);
init();
setComponent ();
addComponent();
addListener();
setVisible(true);
}
private void init () {
setSize(600, 400);
// 设置窗口位置居中
setLocationRelativeTo(null);
// 设置布局
setLayout(new BorderLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void setComponent () {
// 设置第一列宽度为40
table.getColumnModel().getColumn(0).setPreferredWidth(40);
// 设置第二列宽度为120
table.getColumnModel().getColumn(1).setPreferredWidth(120);
}
private void addComponent () {
// 使用srcllpane会自动显示列名
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
}
private void addListener () {
// selection监听器监听表格哪行被选中
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// 被选中的行
int row = table.getSelectedRow();
String str = (String)flight.getValueAt(row,0);
System.out.println("选中的行号是:"+row+",航班号是:"+str);
}
});
}
public static void main(String[] args) {
new TestGui("JTable演示");
}
}
class FlightTableModel extends AbstractTableModel {
// 列名
String[] columnName = new String[]{"航班号", "出发时间", "飞行时间", "出发地", "目的地", "余票", "票价"};
// 表格具体数据
String[][] flightDate = new String[][]{
{"1", "2019-01-18 10:05", "90分钟", "北京", "纽约", "50", "500.0"},
{"2", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},
{"3", "2019-01-18 10:05", "90分钟", "北京", "纽约", "10", "500.0"},
{"4", "2019-01-18 10:05", "90分钟", "北京", "纽约", "40", "500.0"},
};
/**
* 返回一共多少行
*/
@Override
public int getRowCount() {
return flightDate.length;
}
/**
* 返回一共多少列
*/
@Override
public int getColumnCount() {
return columnName.length;
}
/**
* 返回每一个单元格的值
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return flightDate[rowIndex][columnIndex];
}
/**
* 获取每一列的名称
*/
@Override
public String getColumnName(int column) {
return columnName[column];
}
/**
* 单元格是否可以修改
*/
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
}
поворотные части:
// selection监听器监听表格哪行被选中
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
// 被选中的行
int row = table.getSelectedRow();
String str = (String)flight.getValueAt(row,0);
System.out.println("选中的行号是:"+row+",航班号是:"+str);
}
});
В результате получился график: Схема окна:
данные: