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
таблица.