|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Выборка CoffeesFrame.java демонстрирует, как интегрировать JDBC с API GUI, в частности API Swing. Это выводит на экран содержание COFFEES таблица базы данных в таблице и содержит поля и кнопки, которые позволяют Вам добавить строки к таблице. Следующее является снимком экрана этой выборки:

Выборка содержит пять текстовых полей, которые соответствуют каждому из столбцов в COFFEES таблица. Это также содержит три кнопки:
COFFEES основанный на данных в таблице выборки.COFFEES таблица, заменяя существующие данные в таблице выборки.Эта выборка (который требует CoffeesTableModel) демонстрирует следующие общие шаги, чтобы интегрировать JDBC с API Swing:
TableModel интерфейсRowSetListener интерфейс TableModel интерфейс позволяет Java приложение Swing управлять данными в a JTable объект. Выборка, CoffeesTableModel.java, реализации этот интерфейс. Это определяет как a JTable объект должен получить данные от a RowSet объект и дисплей это в таблице.
Отметьте: Хотя эта выборка выводит на экран содержание COFFEES таблица в приложении Swing, class CoffeesTableModel должен работать на любую таблицу SQL при условии, что ее данные могут быть представлены с String объекты. (Однако, поля, которые позволяют пользователям добавить строки к COFFEES, которые определяются в class CoffeesFrame, должен был бы быть изменен для других таблиц SQL.)
Прежде, чем реализовать методы интерфейса TableModel, конструктор class CoffeeTableModel инициализирует различные задействованные переменные, требуемые для этих реализованных методов следующим образом:
public CoffeesTableModel(CachedRowSet rowSetArg)
throws SQLException {
this.coffeesRowSet = rowSetArg;
this.metadata = this.coffeesRowSet.getMetaData();
numcols = metadata.getColumnCount();
// Retrieve the number of rows.
this.coffeesRowSet.beforeFirst();
this.numrows = 0;
while (this.coffeesRowSet.next()) {
this.numrows++;
}
this.coffeesRowSet.beforeFirst();
}
Следующее описывает задействованные переменные, инициализированные в этом конструкторе:
CachedRowSet coffeesRowSet: Хранит содержание таблицы COFFEES.
Эта выборка использует a RowSet объект, в частности a CachedRowSet объект, а не a ResultSet объект по двум причинам. A CachedRowSet объект позволяет пользователю приложения делать изменения в данных содержавшимися в этом, не будучи соединенным с базой данных. Кроме того, потому что a CachedRowSet объект является компонентом JavaBeans, он может уведомить другие компоненты, когда определенные вещи происходят с ним. В этой выборке, когда новая строка добавляется к CachedRowSet объект, это уведомляет компонент Swing, который представляет его данные в таблице, чтобы обновить себя и вывести на экран новую строку.
ResultSetMetaData metadata: Получает число столбцов в таблице COFFEES так же как имена каждого из них.
int numcols, numrows: Хранит число столбцов и строк, соответственно, в таблице COFFEES.
CoffeesTableModel.java выборка реализует следующие методы от TableModel интерфейс:
Class<?> getColumnClass(int columnIndex): Возвращает самый определенный суперкласс для всех значений ячеек в столбце.int getColumnCount(): Возвращает число столбцов в модели.String getColumnName(int columnIndex): Возвращает имя столбца, определенного параметром columnIndex.int getRowCount(): Возвращает число строк в модели.Object getValueAt(int rowIndex, int columnIndex): Возвращает значение для ячейки на пересечении столбца columnIndex и строка rowIndex.boolean isCellEditable(int rowIndex, int columnIndex): Возвращает true если ячейка на пересечении столбца rowIndex и строка columnIndex может быть отредактирован.Следующие методы не были реализованы, потому что эта выборка не позволяет пользователям непосредственно редактировать содержание таблицы:
void addTableModelListener(TableModelListener l): Добавляет слушатель списка, который уведомляется каждый раз, когда изменение к модели данных происходит.void removeTableModelListener(TableModelListener l): Удаляет слушателя из списка, который уведомляется каждый раз, когда изменение к модели данных происходит.void setValueAt(Object aValue, int rowIndex, int columnIndex): Устанавливает значение в ячейке на пересечении столбца columnIndex и строка rowIndex к объекту aValue.Методы getColumnCount и getRowCount возвратите значение задействованных переменных numcols и numrows, соответственно:
public int getColumnCount() {
return numcols;
}
public int getRowCount() {
return numrows;
}
getColumnClass метод возвращает тип данных указанного столбца. Чтобы сохранить вещи простыми, этот метод возвращается String class, таким образом преобразовывая все данные в таблице в String объекты. JTable class использует этот метод, чтобы определить, как представить данные в приложении GUI.
public Class getColumnClass(int column) {
return String.class;
}
getColumnName метод возвращает имя указанного столбца. JTable class использует этот метод, чтобы маркировать каждый из его столбцов.
public String getColumnName(int column) {
try {
return this.metadata.getColumnLabel(column + 1);
} catch (SQLException e) {
return e.toString();
}
}
getColumnAt метод получает значение в указанной строке и столбце в наборе строк coffeesRowSet. JTable class использует этот метод, чтобы заполнить его таблицу. Отметьте, что SQL начинает нумеровать свои строки и столбцы в 1, но TableModel интерфейс запускается в 0; это - причина почему rowIndex и columnIndex значения постепенно увеличиваются 1.
public Object getValueAt(int rowIndex, int columnIndex) {
try {
this.coffeesRowSet.absolute(rowIndex + 1);
Object o = this.coffeesRowSet.getObject(columnIndex + 1);
if (o == null)
return null;
else
return o.toString();
} catch (SQLException e) {
return e.toString();
}
}
Поскольку эта выборка не позволяет пользователям непосредственно редактировать содержание таблицы (строки добавляются другим управлением окном), этот метод возвраты false независимо от значений rowIndex и columnIndex:
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
class CoffeesFrame реализации только один метод от интерфейса RowSetListener, rowChanged. Этот метод вызывают, когда пользователь добавляет строку к таблице.
public void rowChanged(RowSetEvent event) {
CachedRowSet currentRowSet =
this.myCoffeesTableModel.coffeesRowSet;
try {
currentRowSet.moveToCurrentRow();
myCoffeesTableModel = new CoffeesTableModel(
myCoffeesTableModel.getCoffeesRowSet());
table.setModel(myCoffeesTableModel);
} catch (SQLException ex) {
JDBCTutorialUtilities.printSQLException(ex);
// Display the error in a dialog box.
JOptionPane.showMessageDialog(
CoffeesFrame.this,
new String[] {
// Display a 2-line message
ex.getClass().getName() + ": ",
ex.getMessage()
}
);
}
}
Этот метод обновляет таблицу в приложении GUI.
Конструктор class CoffeesFrame инициализирует и размечает компоненты Swing. Следующий оператор получает содержание COFFEES таблица, хранит содержание в CachedRowSet объект myCachedRowSet, и инициализирует JTable Компонент Swing:
CachedRowSet myCachedRowSet = getContentsOfCoffeesTable(); myCoffeesTableModel = new CoffeesTableModel(myCachedRowSet); myCoffeesTableModel.addEventHandlersToRowSet(this); // Displays the table table = new JTable(); table.setModel(myCoffeesTableModel);
Как упомянуто ранее, вместо a ResultSet объект представить содержание COFFEES таблица, эта выборка использует a RowSet объект, особенно a CachedRowSet объект.
Метод CoffeesFrame.getContentsOfCoffeesTable получает содержание таблицы COFFEES.
Метод CoffeesTableModel.addEventHandlersToRowSet добавляет обработчик событий, определенный в CoffeesFrame class, который является методом rowChanged, к задействованной переменной набора строк CoffeesTableModel.coffeesRowSet. Это включает class CoffeesFrame уведомлять набор строк coffeesRowSet из любых событий, в частности когда пользователь щелкает по строке кнопки Add к таблице, базе данных Обновления, или изменениям Отбрасывания. Когда набор строк coffeesRowSet уведомляется относительно одного из этих изменений, метода CoffeesFrame.rowChanged вызывается.
Оператор table.setModel(myCoffeesTableModel) определяет, что это использует CoffeesTableModel объект myCoffeesTableModel заполнить JTable Компонент Swing table.
Следующие операторы определяют что CoffeesFrame Использование class расположение GridBagLayout размечать его компоненты Swing:
Container contentPane = getContentPane();
contentPane.setComponentOrientation(
ComponentOrientation.LEFT_TO_RIGHT);
contentPane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
См., Как Использовать GridBagLayout в Создании GUI С JFC/Swing для получения дополнительной информации об использовании расположения GridBagLayout.
См. исходный код для CoffeesFrame.java видеть, как компоненты Swing этой выборки добавляются к расположению GridBagLayout.
Следующий оператор добавляет слушателя строки кнопки Add к таблице:
button_ADD_ROW.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(
CoffeesFrame.this, new String[] {
"Adding the following row:",
"Coffee name: [" +
textField_COF_NAME.getText() +
"]",
"Supplier ID: [" +
textField_SUP_ID.getText() + "]",
"Price: [" +
textField_PRICE.getText() + "]",
"Sales: [" +
textField_SALES.getText() + "]",
"Total: [" +
textField_TOTAL.getText() + "]"
}
);
try {
myCoffeesTableModel.insertRow(
textField_COF_NAME.getText(),
Integer.parseInt(textField_SUP_ID.getText().trim()),
Float.parseFloat(textField_PRICE.getText().trim()),
Integer.parseInt(textField_SALES.getText().trim()),
Integer.parseInt(textField_TOTAL.getText().trim())
);
} catch (SQLException sqle) {
displaySQLExceptionDialog(sqle);
}
}
});
Когда пользователь нажимает эту кнопку, она выполняет следующее:
CoffeesTableModel.insertRow, который добавляет строку к задействованной переменной CoffeesTableModel.coffeesRowSet.Если SQLException бросается, тогда метод CoffeesFrame.displaySQLExceptionDialog создает диалоговое окно сообщения, которое выводит на экран контент SQLException.
Следующий оператор добавляет слушателя базы данных кнопки Update:
button_UPDATE_DATABASE.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
myCoffeesTableModel.coffeesRowSet.acceptChanges();
msgline.setText("Updated database");
} catch (SQLException sqle) {
displaySQLExceptionDialog(sqle);
// Now revert back changes
try {
createNewTableModel();
msgline.setText("Discarded changes");
} catch (SQLException sqle2) {
displaySQLExceptionDialog(sqle2);
}
}
}
}
);
Когда пользователь нажимает эту кнопку, таблицу COFFEES обновляется с содержанием набора строк myCoffeesTableModel.coffeesRowSet.
Следующий оператор добавляет слушателя изменений кнопки Discard:
button_DISCARD_CHANGES.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
createNewTableModel();
} catch (SQLException sqle) {
displaySQLExceptionDialog(sqle);
}
}
});
Когда пользователь нажимает эту кнопку, метод CoffeesFrame.createNewTableModel вызывается, который повторно заполняет JTable компонент с содержанием COFFEES таблица.