Spec-Zone .ru
спецификации, руководства, описания, API
След: JDBC (ТМ) Доступ к базе данных
Урок: Основы JDBC
Используя JDBC с API GUI
Домашняя страница > JDBC (ТМ) Доступ к базе данных > Основы JDBC

Используя JDBC с API GUI

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

Снимок экрана Демонстрационного CoffeeFrames.java

Выборка содержит пять текстовых полей, которые соответствуют каждому из столбцов в COFFEES таблица. Это также содержит три кнопки:

Эта выборка (который требует CoffeesTableModel) демонстрирует следующие общие шаги, чтобы интегрировать JDBC с API Swing:

  1. Реализация TableModel интерфейс
  2. Реализация RowSetListener интерфейс
  3. Разметка компонентов Swing
  4. Добавление слушателей для кнопок в выборке

Реализация javax.swing.event. TableModel

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();
}

Следующее описывает задействованные переменные, инициализированные в этом конструкторе:

CoffeesTableModel.java выборка реализует следующие методы от TableModel интерфейс:

Следующие методы не были реализованы, потому что эта выборка не позволяет пользователям непосредственно редактировать содержание таблицы:

Реализация getColumnCount и getRowCount

Методы getColumnCount и getRowCount возвратите значение задействованных переменных numcols и numrows, соответственно:

public int getColumnCount() {
    return numcols;
}

public int getRowCount() {
    return numrows;
}

Реализация getColumnClass

getColumnClass метод возвращает тип данных указанного столбца. Чтобы сохранить вещи простыми, этот метод возвращается String class, таким образом преобразовывая все данные в таблице в String объекты. JTable class использует этот метод, чтобы определить, как представить данные в приложении GUI.

public Class getColumnClass(int column) {
    return String.class;
}

Реализация getColumnName

getColumnName метод возвращает имя указанного столбца. JTable class использует этот метод, чтобы маркировать каждый из его столбцов.

public String getColumnName(int column) {
    try {
        return this.metadata.getColumnLabel(column + 1);
    } catch (SQLException e) {
        return e.toString();
    }
}

Реализация getColumnAt

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();
    }
}

Реализация isCellEditable

Поскольку эта выборка не позволяет пользователям непосредственно редактировать содержание таблицы (строки добавляются другим управлением окном), этот метод возвраты false независимо от значений rowIndex и columnIndex:

public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
}

Реализация javax.sql. RowSetListener

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.

Разметка Компонентов Swing

Конструктор 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);
        }
    }
});

Когда пользователь нажимает эту кнопку, она выполняет следующее:

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


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя Хранимые процедуры
Следующая страница: Конец Следа