Потратив бесчисленное количество часов на работу со Swing и стараясь изо всех сил учиться, я столкнулся с этой проблемой. Прежде чем перейти к конкретной проблеме, я хотел бы дать краткое изложение ситуации. Не стесняйтесь пропустить это, если вы сразу заметили проблему.
Я провел последние 3 дня, работая с JTables (или, по крайней мере, пытаясь). У меня есть пара проблем с конструктором JTable:
JTable(Object[][] rowData, Object[] columnNames)
Прочитав и перечитав документацию Oracle, я наткнулся на набор пунктов относительно конструктора JTable (минусы его использования):
Они автоматически делают каждую ячейку редактируемой.
Они обрабатывают все типы данных одинаково (как строки). Например, если столбец таблицы содержит логические данные, таблица может отображать данные в виде флажка. Однако, если вы используете один из двух конструкторов JTable, перечисленных ранее, ваши логические данные отображаются в виде строки. Вы можете увидеть эту разницу в колонке «Вегетарианство» на предыдущем рисунке.
- Они требуют, чтобы вы поместили все данные таблицы в массив или вектор, что может не подходить для некоторых данных. Например, если вы создаете экземпляр набора объектов из базы данных, вам может потребоваться напрямую запрашивать у объектов их значения, а не копировать все их значения в массив или вектор.
И первый, и третий пункты вызывают у меня вопросы, поэтому я хотел бы задать несколько вопросов:
Как я могу сделать ширину отдельного столбца статической, прямо сейчас, все ширины столбцов четные и равномерно масштабируются при изменении размера. Это проблема, поскольку столбец «ID» явно не требует столько места, сколько столбец «Электронная почта».
У меня также возникла проблема с отображением имен столбцов по какой-то странной причине, когда мои имена столбцов String[] были переданы в конструктор, но в фрейме ничего не отображается.
Код JTable:
private JTable addStudentsJTable(){
String[] columnNames = {
"Teacher ID",
"Student ID",
"Name",
"Surname",
"E-mail",
"Date of Birth",
"Telephone",
"Course",
"OOP",
"Year of Membership",
"Consent"};
Object[][] data = {
{1, 1, "Random", "Student", "[email protected]", "1/1/1970", 9999999, "MC", true, 2014, true},
{2, 2, "Student", "Surname", "[email protected]", "1/1/1970", 11111111, "AIO", true, 2000, true}
};
studentsJTable = new JTable(data, columnNames);
studentsJTable.setPreferredScrollableViewportSize(new Dimension(850,200));
studentsJTable.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(studentsJTable);
add(scrollPane);
return studentsJTable;
}
Весь класс JFrame:
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableModel;
import java.awt.*;
public class JDatabaseMainFrame extends JFrame {
private JTable studentsJTable;
private JPanel contentPane;
public JDatabaseMainFrame(){
JFrame frame = new JFrame("JDatabase");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("JDatabase");
setResizable(true);
setMinimumSize(new Dimension(850,350));
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(new CardLayout(0, 0));
//Adding tabs
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT);
contentPane.add(tabbedPane, "Tabs");
//Adding Student's panel
JPanel studentsPanel = new JPanel();
tabbedPane.addTab("Students", null, studentsPanel, null);
studentsPanel.setLayout(new BorderLayout(0, 0));
//Adding JTable to Student's panel
JTable studentsJTable = addStudentsJTable();
studentsPanel.add(studentsJTable, BorderLayout.CENTER);
//Adding Teacher's panel
JPanel teachersPanel = new JPanel();
tabbedPane.addTab("Teachers", null, teachersPanel, null);
//Adding Outing's panel
JPanel outingsPanel = new JPanel();
tabbedPane.addTab("Outings", null, outingsPanel, null);
setBounds(200,200,650,650);
pack();
setVisible(true);
}
private void printData(JTable jTable){
int numberOfRows = jTable.getRowCount();
int numberOfColumns = jTable.getColumnCount();
TableModel model = jTable.getModel();
for(int i = 0; i < numberOfRows; i++){
System.out.println("Row: " + i + ":");
for(int j = 0; j < numberOfColumns; j++){
System.out.println(" " + model.getValueAt(i, j));
}
System.out.println();
}
System.out.println("-------------------------------");
}
private JTable addStudentsJTable(){
String[] columnNames = {
"Teacher ID",
"Student ID",
"Name",
"Surname",
"E-mail",
"Date of Birth",
"Telephone",
"Course",
"OOP",
"Year of Membership",
"Consent"};
Object[][] data = {
{1, 1, "Random", "Student", "[email protected]", "1/1/1970", 9999999, "MC", true, 2014, true},
{2, 2, "Student", "Surname", "[email protected]", "1/1/1970", 11111111, "AIO", true, 2000, true}
};
studentsJTable = new JTable(data, columnNames);
studentsJTable.setPreferredScrollableViewportSize(new Dimension(850,200));
studentsJTable.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(studentsJTable);
add(scrollPane);
return studentsJTable;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JDatabaseMainFrame frame = new JDatabaseMainFrame();
frame.setVisible(true);
}
});
}
}
Не стесняйтесь скомпилировать его, чтобы увидеть текущий результат!