Создание базы данных автомобилестроительного предприятия в виде настольного приложения на языке Java
Разработка логической схемы базы данных автомобилестроительного предприятия. Инфологическое моделирование системы. Создание графического интерфейса пользователя для базы данных средствами языка программирования Java. Тестирование программных средств.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 16.12.2013 |
Размер файла | 2,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
} catch (SQLException ex) {
}
}
}
});
В данной операции проходит фильтрация записей таблицы в соответствии с условием. Сначала с помощью логической переменной производится проверка, выполнена ли операция фильтрации: если она уже выполнена, код блокирует выполнение других операций с таблицей и при нажатии кнопки отменяет действие фильтра, а также возвращает исходный вид таблицы. Если же фильтр не включен, производится его инициализация. Выполняется запрос на выборку записей, удовлетворяющих условию, введенному пользователем в поле JTextField по выбранному в компоненте JComboBox полю. Затем таблица пересоздается в соответствии с количеством записей, полученных после выполнения запроса на фильтрацию. Конечным этапом выполнения запроса является вывод в таблицу записей, полученных в результате фильтрации, в соответствии с типом сортировки, определяемым выбранной пользователем JRadioButton.
3.3 Разработка интерфейса пользователя
При помощи библиотеки Swingбыла создана экранная форма, на которой в дальнейшем были помещены 3 вкладки, каждая вкладка соответствует одной таблице базы данных. Вкладки имеют одинаковую структуру.
Помимо таблицы, на каждой вкладке находятся кнопки навигации по таблице, кнопки модификации данных, компоненты для реализации сортировки и фильтрации, а также элементы, отвечающие за выполнение вводимых пользователем SQL-запросов.
Окно приложения отображено на рисунке 1.
Рисунок 1 - Экранная форма приложения
Интерфейс приложения выполнен в соответствии с требованиями эргономики и является стандартным для настольных приложений, реализующих доступ к базам данных.
3.4 Разработка форм входных и выходных данных
Формами входных данных является табличный компонент, т.к. он позволяет редактировать все свои ячейки, кроме тех, которые отвечают за отображение первичного ключа, который, по сути, является счетчиком. Впоследствии внесенные в табличный компонент изменения можно сохранить с помощью кнопки «Сохранить запись». Помимо этого, к формам входных данных можно отнести компонент выбора поля для сортировки/фильтрации, поле ввода условия выборки для фильтрации и текстовую область для ввода пользовательских SQL-запросов для выполнения. Также к форме входных данных можно отнести добавление записи с пустыми значениями неключевых атрибутов и заполненным полем первичного ключа.
Формой выходных данных также являются табличные компоненты, т.к. после каких-либо изменений в таблице базе данных соответствующий ей табличный компонент отображает произведенные изменения.
3.5 Тестирование программных средств
В любом программном продукте, реализующем работу с базой данных, для каждой операции манипулирования данными требуется проводить тестирования на 3 типа вводимых данных: допустимые, недопустимые и граничные.
Например, проведем тестирование поля На_складе таблицы Продукция базы данных автомобилестроительного предприятия.
Тип поля На_складе и в базе данных, и в табличном компоненте является полем Integer, т.е. имеет целочисленный тип.
Попробуем ввести в ячейку табличного компонента данные строкового типа, т.е. данные, недопустимые для этого поля. При попытке завершить редактирование ячейки приложение не позволит нам продолжить и сохранить изменения в этой ячейке из-за несоответствия типов введенных данных и данных, указанных для этого поля.
Попробуем ввести допустимое значение в эту же ячейку, т.е. целое число. Т.к. типы введенных данных и данных, специфических для поля, совпадают, то значение в ячейке табличного компонента сохранится. Впоследствии эти изменения можно будет внести непосредственно в базу данных с помощью кнопки «Сохранить запись».
3.6 Разработка сопроводительных документов
Для корректной работы с приложением необходимо предварительно установить свободно распространяемый компанией Oracle программный продукт JavaRuntimeEnvironment (JRE), сочетающий в себе минимальную реализацию виртуальной машины Java и библиотеку Java-классов.
Перед запуском приложения необходимо убедиться, что пользователь имеет права администратора, а также файлы «Автомобилестроительное предприятие.jar» и «Автомобилестроительное предприятие.accdb» находятся в одной директории.
После выполнения вышеописанных пунктов необходимо запустить файл «Автомобилестроительное предприятие.jar». Откроется главное окно приложения с панелью вкладок. Переход между таблицами базы данных осуществляется переключением вкладок.
Для добавления записи в таблицу необходимо нажать кнопку «Добавить запись». Ключевое поле добавится автоматически и будет недоступно для редактирования. Остальные атрибуты будут доступны для редактирования.
Для удаления записи необходимо выделить запись, предназначенную для удаления, и нажать кнопку «Удалить запись».
Для редактирования записей таблицы необходимо выделить ячейку для редактирования, ввести в нее допустимые данные, нажать кнопку Enter, при сбросе фокуса с записи снова переключиться на нее и нажать кнопку «Сохранить запись».
Для реализации сортировки необходимо выбрать поле для сортировки и тип сортировки, после чего нажать кнопку «Сортировать». Для реализации функции фильтра необходимо выбрать поле для фильтрации, ввести условие отбора и выбрать тип сортировки полученных записей, после чего нажать кнопку «Фильтровать». Для отмены действия фильтра необходимо повторно нажать кнопку, сменившую название на «Снять фильтр».
Для выполнения пользовательского SQL-запроса необходимо ввести в специальное поле SQL-запрос, после чего нажать кнопку «Выполнить запрос». Для отмены необходимо нажать кнопку, сменившую название на «Отмена».
Выход из приложения осуществляется нажатием изображения креста на красном фоне в правом верхнем углу приложения.
ЗАКЛЮЧЕНИЕ
Использование информационных систем в нашем мире имеет глобальный характер.
Информационные системы дают возможность систематизировать информационные ресурсы общества. Исследования показывают, что грамотное пользование информационных ресурсов значительно экономит природные ресурсы нашей планеты.
Базы данных позволяют оптимизировать и, в первую очередь, автоматизировать информационные процессы. Во многих развитых странах основная часть работоспособного населения принимает участие в обработке, хранении и передаче информационных продуктов и услуг.
Использование БД обеспечивает надежное хранение большого количества данных и легкое манипулирование ими. При этом БД обеспечивают экономные затраты памяти компьютерных систем.
В процессе выполнения курсового проекта была исследована предметная область автомобилестроительного предприятия, реализованы этапы проектирования базы данных, построены информационно-логическая и логическая схемы данных, составлена структура базы данных, соответствующая СУБД MicrosoftAccess.
В ходе разработки курсового проекта были изучены такие языки, как SQL иJava, а также изучена методика проектирования баз данных и их создание в СУБД MicrosoftAccess.
В результате выполнения курсового проекта было получено приложение базы данных автомобилестроительного предприятия в виде настольного приложения на языкеJava.
СПИСОК ЛИТЕРАТУРЫ
1. Карпова Т. С.Базы данных: модели, разработка, реализация. -СПб.:Питер, 2010.
2. Фуфаев Э. В. Базы данных. Учебное пособие для студентов учреждений СПО, 5-е изд. -М.: Издательский центр «Академия», 2008.
3. Смирнов С. Н., Киселев А. В. Практикум по работе с базами данных. - М.: Гелиос АРВ, 2012.
4. Дунаев В. В. Базы данных. Язык SQL для студента, 2-е изд. доп. и перераб. - Спб.: БХВ-Петербург, 2012.
5. Мартин Грубер. Введение в SQL. -СПб.: БХВ-Петербург, 2006.
6. Карпова Т.С. Базы данных: модели, разработка, реализация. - СПб.: Питер, 2002.
7. Крёнке Д. Теория и практика построения баз данных. - СПб.: Питер, 2003.
8. Мейер М. Теория реляционных баз данных. - М.: Москва,2006.
9. Шилдт Г. Java.Полное руководство, 8-е изд. - М.:Вильямс, 2012.
10. Блинов И.Н., Романчик В.С. Java. Промышленное программирование. Практическое пособие. - М.: УниверсалПресс, 2007.
11. Блох Дж. Java. Эффективное программирование. - М.: Лори, 2002.
12. Хорстманн К.С., Корнелл Г. Java 2. Том 1. Основы, 7-е изд. - М.: Вильямс, 2007.
13. Хорстманн К.С., Корнелл Г. - Java 2. Том 2. Тонкости программирования. - М.:Вильямс, 2007.
ПРИЛОЖЕНИЯ
Приложение А
Листинг
Модуль AppGUI.java
packagedbgui;
importjava.awt.EventQueue;
importjava.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
public class AppGUI {
/** Компонент для подключения к базе данных. */
static Connection conn;
/** Компоненты, реализующие главное окно приложения. */
private JFrame appFrame;
private JTabbedPane frameTabbedPane;
/** Запуск приложения. */
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
AppGUI window = new AppGUI();
window.appFrame.setVisible(true);
} catch (Exception ex) {
}
}
});
}
/** Создание приложения. */
public AppGUI() {
initAppGUI();
}
/** Инициализация содержимого главного окна приложения. */
private void initAppGUI() {
final int SCREEN_WIDTH = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width;
final int SCREEN_HEIGHT = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;
appFrame = new JFrame("Автомобилестроительное предприятие");
appFrame.setSize(1030, 568);
appFrame.setLocation((SCREEN_WIDTH - appFrame.getWidth()) / 2, (SCREEN_HEIGHT - appFrame.getHeight()) / 2);
appFrame.setResizable(false);
appFrame.getContentPane().setLayout(null);
appFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
try {
StaffTab.state.close();
ManufacturingTab.state.close();
ProductionTab.state.close();
conn.close();
System.exit(0);
} catch (Exception ex) {
}
}
});
/** Подключение к базе данных. */
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String path = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=";
path += System.getProperty("user.dir");
path += "\\Автомобилестроительное предприятие.accdb";
String username = "admin";
String password = "0";
conn = DriverManager.getConnection(path, username, password);
} catch (Exception ex) {
ex.printStackTrace();
}
/** Добавление вкладок в основное окно приложения. */
frameTabbedPane = new JTabbedPane();
frameTabbedPane.setBounds(-1, -3, 1032, 541);
JPanel staffTab = StaffTab.initTab();
frameTabbedPane.addTab("<html><h1 marginwidth=90>Персонал</h1></html>", staffTab);
JPanel manufacturingTab = ManufacturingTab.initTab();
frameTabbedPane.addTab("<html><h1 marginwidth=90>Производство</h1></html>", manufacturingTab);
JPanel productionTab = ProductionTab.initTab();
frameTabbedPane.addTab("<html><h1 marginwidth=90>Продукция</h1></html>", productionTab);
appFrame.getContentPane().add(frameTabbedPane);
}
}
МодульTabContent.java
package dbgui;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
/** Класс, реализующий общие для всех вкладок компоненты,
* не влияющие на функциональность каждой из вкладок.
*/
class TabContent {
/** Навигационные компоненты. */
static JButton bFirstRow;
static JButton bPrevRow;
static JButton bNextRow;
static JButton bLastRow;
/** Компоненты для обозначения. */
static JLabel lblField;
static JLabel lblFilter;
static JLabel lblCustomSQL;
/** Конструктор класса TabContent. */
public TabContent(JPanel tabPanel) {
initNavComps(tabPanel);
/** Обозначение для сортировки/фильтрации по полю таблицы. */
lblField = new JLabel("пополю:");
lblField.setBounds(800, 279, 64, 16);
tabPanel.add(lblField);
/** Обозначение для условия фильтрации. */
lblFilter = new JLabel("фильтр:");
lblFilter.setBounds(800, 303, 64, 25);
tabPanel.add(lblFilter);
/** Обозначение для поля ввода пользовательских SQL-запросов. */
lblCustomSQL = new JLabel("<html><font size=4>Введите SQL-запрос:</font></html>");
lblCustomSQL.setBounds(12, 340, 151, 16);
tabPanel.add(lblCustomSQL);
}
/** Инициализация навигационных компонентов для таблиц. */
private static void initNavComps(JPanel p) {
/** Кнопка выбора первой строки. */
bFirstRow = new JButton("<html><h3 align=center>Первая<br>запись</h3></html>");
bFirstRow.setBounds(12, 214, 150, 50);
p.add(bFirstRow);
/** Кнопка выбора предыдущей строки. */
bPrevRow = new JButton("<html><h3 align=center>Предыдущая<br>запись</h3></html>");
bPrevRow.setBounds(174, 214, 150, 50);
p.add(bPrevRow);
/** Кнопка выбора следующей строки. */
bNextRow = new JButton("<html><center><h3>Следующая<br>запись</h3></center></html>");
bNextRow.setBounds(336, 214, 150, 50);
p.add(bNextRow);
/** Кнопка выбора последней строки. */
bLastRow = new JButton("<html><h3 align=center>Последняя<br>запись</h3></html>");
bLastRow.setBounds(498, 214, 150, 50);
p.add(bLastRow);
}
Модуль StaffTab.java
package dbgui;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;
/** Класс, реализующий вкладку Персонал. */
class StaffTab {
/** Компоненты, реализующие подключение к базе данных. */
final static String TABLE_NAME = "Персонал";
static Statement state;
static ResultSet rs;
static String sql;
/** Компоненты для создания таблицы. */
private static JTable table;
private static DefaultTableModel tableModel;
/** Компоненты для модификации таблицы. */
private static JButton bAddRow;
private static JButton bRemoveRow;
private static JButton bSaveRow;
/** Компоненты для сортировки/фильтрации. */
private static JComboBox<String> cbSortFilter;
private static JButton bFilter;
private static JButton bSort;
private static JRadioButton rbSortAsc;
private static JRadioButton rbSortDesc;
private static JTextField tfFilter;
private static boolean filterFlag;
/** Компоненты для реализации пользовательского ввода SQL-запросов. */
private static JTextArea taCustomSQL;
private static JScrollPane spCustomSQL;
private static JButton bCustomSQL;
private static boolean customSQLFlag;
/** Инициализация вкладки. */
static JPanel initTab() {
/** Создание таблицы по ее модели. */
table = new JTable();
table.setRowHeight(20);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
initTableModel();
table.setModel(tableModel);
table.getTableHeader().setReorderingAllowed(false);
table.getColumnModel().getColumn(0).setPreferredWidth(70);
table.getColumnModel().getColumn(1).setPreferredWidth(125);
table.getColumnModel().getColumn(2).setPreferredWidth(125);
table.getColumnModel().getColumn(3).setPreferredWidth(125);
table.getColumnModel().getColumn(4).setPreferredWidth(85);
table.getColumnModel().getColumn(5).setPreferredWidth(150);
table.getColumnModel().getColumn(6).setPreferredWidth(150);
table.getColumnModel().getColumn(7).setPreferredWidth(150);
try {
initDBConn();
createTable();
table.setRowSelectionInterval(0, 0);
} catch (Exception ex) {
}
JScrollPane spTable = new JScrollPane(table);
spTable.setBounds(12, 12, 998, 180);
JPanel staffTab = new JPanel();
staffTab.setLayout(null);
staffTab.add(spTable);
/** Реализация конструктора класса TabContent для вкладки. */
new TabContent(staffTab);
/** Инициализация компонентов. */
initTableModComps(staffTab);
initSortFilterComps(staffTab);
initCustomSQLComps(staffTab);
/** Инициализация действий для компонентов. */
initNavCompsActions();
initTableModCompsActions();
initSortFilterCompsActions();
initCustomSQLCompsActions();
/** Возвратготовойвкладки. */
return staffTab;
}
/** Инициализация модели таблицы. */
@SuppressWarnings({"serial", "rawtypes"})
public static void initTableModel() {
tableModel = new DefaultTableModel(
new Object[][] { },
new String[] {
"Код_раб", "Фамилия", "Имя", "Отчество", "Цех", "Должность", "Специализация", "Квалификация"
}
) {
Class[] columnTypes = new Class[] {
Integer.class, String.class, String.class, String.class, String.class, String.class, String.class, String.class
};
public Class<?> getColumnClass(int columnIndex) {
return columnTypes[columnIndex];
}
boolean[] columnEditables = new boolean[] {
false, true, true, true, true, true, true, true
};
public boolean isCellEditable(int row, int column) {
return columnEditables[column];
}
/** Инициализация подключения к таблице Персонал базы данных. */
private static void initDBConn() {
try {
sql = "select * from " + TABLE_NAME + " order by Код_раб asc";
state = AppGUI.conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
state.execute(sql);
rs = state.getResultSet();
} catch (SQLException ex) {
}
}
/** Создание таблицы. */
private static void createTable() throws SQLException {
int rc = table.getRowCount();
for (int i = 0; i < rc; i++) {
tableModel.removeRow(0);
}
int cc = rs.getMetaData().getColumnCount();
int i = 0;
rs.beforeFirst();
while ((rs != null) && (rs.next())) {
tableModel.addRow(new Object[] {null, null, null, null, null, null, null, null});
for (int j = 1; j <= cc; j++) {
table.setValueAt(rs.getObject(j), i, j-1);
}
i++;
}
}
/** Заполнение таблицы. */
private static void fillTable() throws SQLException {
int cc = rs.getMetaData().getColumnCount();
int i = 0;
rs.beforeFirst();
while ((rs != null) && (rs.next())) {
for (int j = 1; j <= cc; j++) {
table.setValueAt(rs.getObject(j), i, j-1);
}
i++;
}
}
/** Инициализация компонентов для модификации базы данных через таблицу. */
private static void initTableModComps(JPanel p) {
/** Кнопка добавления строки. */
bAddRow = new JButton("<html><h3>Добавить запись</h3></html>");
bAddRow.setBounds(12, 277, 204, 50);
p.add(bAddRow);
/** Кнопка удаления строки. */
bRemoveRow = new JButton("<html><h3>Удалитьзапись</h3></html>");
bRemoveRow.setBounds(228, 277, 204, 50);
p.add(bRemoveRow);
/** Кнопка сохранения изменений в строке. */
bSaveRow = new JButton("<html><h3>Сохранить запись</h3></html>");
bSaveRow.setBounds(444, 277, 204, 50);
p.add(bSaveRow);
}
/** Инициализация компонентов для сортировки и фильтрации. */
private static void initSortFilterComps(JPanel p) {
/** Выпадающий список с именами полей для сортировки/фильтрации. */
cbSortFilter = new JComboBox<String>();
cbSortFilter.setBounds(864, 277, 146, 22);
cbSortFilter.addItem("Код_раб");
cbSortFilter.addItem("Фамилия");
cbSortFilter.addItem("Имя");
cbSortFilter.addItem("Отчество");
cbSortFilter.addItem("Цех");
cbSortFilter.addItem("Должность");
cbSortFilter.addItem("Специализация");
cbSortFilter.addItem("Квалификация");
cbSortFilter.setSelectedIndex(0);
p.add(cbSortFilter);
/** Кнопка сортировки. */
bSort = new JButton("<html><h3>Сортировать</h3></html>");
bSort.setBounds(750, 214, 124, 50);
p.add(bSort);
/** Кнопка фильтрации. */
bFilter = new JButton("<html><h3>Фильтровать</h3></html>");
bFilter.setBounds(886, 214, 124, 50);
p.add(bFilter);
/** Группа, объединяющая радиокнопки. */
ButtonGroupgroup = newButtonGroup();
/** Радиокнопка сортировки по возрастанию. */
rbSortAsc = new JRadioButton("по возрастанию");
rbSortAsc.setBounds(660, 277, 125, 25);
rbSortAsc.setSelected(true);
group.add(rbSortAsc);
p.add(rbSortAsc);
/** Радиокнопка сортировки по убыванию. */
rbSortDesc = new JRadioButton("по убыванию");
rbSortDesc.setBounds(660, 302, 125, 25);
group.add(rbSortDesc);
p.add(rbSortDesc);
/** Текстовое поле для ввода условия фильтрации. */
tfFilter = new JTextField();
tfFilter.setBounds(864, 303, 147, 25);
p.add(tfFilter);
/** Логическая переменная, указывающая на наличие/отсутствие фильтра записей. */
filterFlag = false;
}
/** Инициализация компонентов для выполнения SQL-запросов, введенных пользователем. */
private static void initCustomSQLComps(JPanel p) {
/** Кнопка выполнения SQL-запроса, введенного пользователем. */
bCustomSQL = new JButton("<html><h2>Выполнить запрос</h2></html>");
bCustomSQL.setBounds(660, 356, 350, 108);
p.add(bCustomSQL);
/** Текстовое поле для ввода SQL-запроса. */
taCustomSQL = new JTextArea();
/** Панель для прокрутки текстового поля ввода SQL-запросов. */
spCustomSQL = new JScrollPane(taCustomSQL);
spCustomSQL.setBounds(12, 356, 636, 109);
p.add(spCustomSQL);
/** Логическая переменная, указывающая, выполнен ли пользовательский SQL-запрос. */
customSQLFlag = false;
}
/** Назначение действий для навигационных компонентов. */
private static void initNavCompsActions() {
/** Действие для кнопки выбора первой строки. */
TabContent.bFirstRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (table.getRowCount() > 0) {
table.setRowSelectionInterval(0, 0);
table.scrollRectToVisible(new Rectangle(table.getCellRect(0, 0, true)));
} else {
JOptionPane.showMessageDialog(null, "В таблице нет записей.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}
}
});
/** Действие для кнопки выбора предыдущей строки. */
TabContent.bPrevRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (table.getRowCount() > 0) {
int selRow = table.getSelectedRow();
if (selRow == 0) {
table.setRowSelectionInterval(0, 0);
} else {
int selPrevRow = selRow - 1;
table.setRowSelectionInterval(0, selPrevRow);
table.scrollRectToVisible(new Rectangle(table.getCellRect(selPrevRow, 0, true)));
}
} else {
JOptionPane.showMessageDialog(null, "Втаблиценетзаписей.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}
}
});
/** Действие для кнопки выбора следующей строки. */
TabContent.bNextRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (table.getRowCount() > 0) {
int rowCount = table.getRowCount();
int selRow = table.getSelectedRow();
if (selRow == rowCount - 1) {
table.setRowSelectionInterval(0, rowCount - 1);
} else {
int selNextRow = selRow + 1;
table.setRowSelectionInterval(0, selNextRow);
table.scrollRectToVisible(new Rectangle(table.getCellRect(selNextRow, 0, true)));
}
} else {
JOptionPane.showMessageDialog(null, "Втаблиценетзаписей.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}
}
});
/** Действие для кнопки выбора последней строки. */
TabContent.bLastRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int rowCount = table.getRowCount();
if (rowCount > 0) {
table.setRowSelectionInterval(0, rowCount - 1);
table.scrollRectToVisible(new Rectangle(table.getCellRect(rowCount - 1, 0, true)));
} else {
JOptionPane.showMessageDialog(null, "Втаблиценетзаписей.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}
}
});
}
/** Назначение действий для компонентов, реализующих модификацию базы данных через таблицу. */
private static void initTableModCompsActions() {
/** Действие для кнопки добавления новой строки. */
bAddRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int rowCount = table.getRowCount();
tableModel.addRow(new Object[] {null, null, null, null, null, null, null, null, null});
int counter = 0;
if (rowCount == 0 || (Integer) table.getValueAt(0, 0) > 1) {
counter = 1;
} else {
if (rowCount == 1) {
counter = 2;
} else {
for (int i = 0; i < rowCount - 1; i++) {
if ((Integer) table.getValueAt(i, 0) + 1 != (Integer) table.getValueAt(i + 1, 0)) {
counter = (Integer) table.getValueAt(i, 0) + 1;
break;
} else {
counter = rowCount + 1;
table.setValueAt(counter, rowCount, 0);
try {
rs.moveToInsertRow();
rs.updateInt(1, (Integer) table.getValueAt(rowCount, 0));
rs.insertRow();
initDBConn();
fillTable();
} catch (Exception ex) {
}
table.setRowSelectionInterval(0, counter - 1);
table.setColumnSelectionInterval(0, 0);
table.scrollRectToVisible(new Rectangle(table.getCellRect(counter - 1, 0, true)));
}
});
/** Действие для кнопки удаления выбранной строки. */
bRemoveRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int selRow = table.getSelectedRow();
if (table.getRowCount() > 0) {
try {
rs.absolute(selRow + 1);
rs.deleteRow();
tableModel.removeRow(selRow);
} catch (SQLException ex) {
}
if (table.getRowCount() > 0) {
if (selRow < table.getRowCount()) {
table.setRowSelectionInterval(selRow, selRow);
} else {
table.setRowSelectionInterval(selRow - 1 , selRow - 1);
}
} else {
JOptionPane.showMessageDialog(null, "В таблице нет записей.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}
}
});
/** Действие для кнопки сохранения изменений в выбранной строке. */
bSaveRow.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int selRow = table.getSelectedRow();
int cc = table.getColumnCount();
if (table.getRowCount() > 0) {
try {
rs.absolute(selRow + 1);
for (int j = 1; j < cc; j++) {
rs.updateString(j + 1, (String) table.getValueAt(selRow, j));
}
rs.updateRow();
} catch (SQLException ex) {
}
} else {
JOptionPane.showMessageDialog(null, "В таблице нет записей.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}
}
});
}
/** Назначение действий для компонентов, реализующих сортировку/фильтрацию. */
private static void initSortFilterCompsActions() {
/** Действие для кнопки сортировки. */
bSort.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String field = cbSortFilter.getSelectedItem().toString();
sql = "select * from " + TABLE_NAME + " order by " + field + " ";
if (table.getRowCount() > 0) {
if (rbSortAsc.isSelected()) {
sql += "asc";
} else {
sql += "desc";
}
try {
state.execute(sql);
rs = state.getResultSet();
fillTable();
} catch (SQLException ex) {
}
} else {
JOptionPane.showMessageDialog(null, "В таблице нет записей.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}
}
});
/** Действие для кнопки фильтрации. */
bFilter.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (! filterFlag) {
String field = cbSortFilter.getSelectedItem().toString();
sql = "select * from " + TABLE_NAME + " where " + field + " " + tfFilter.getText() + " order by " + field + " ";
if (rbSortAsc.isSelected()) {
sql += "asc";
} else {
sql += "desc";
};
try {
state.execute(sql);
rs = state.getResultSet();
createTable();
filterFlag = true;
bFilter.setText("<html><h3><center>Снять фильтр</center></h3></html>");
bAddRow.setEnabled(! filterFlag);
bRemoveRow.setEnabled(! filterFlag);
bSaveRow.setEnabled(! filterFlag);
bSort.setEnabled(! filterFlag);
bCustomSQL.setEnabled(! filterFlag);
table.setRowSelectionInterval(0, 0);
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Неверный запрос. Проверьте синтаксис.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}} else {
sql = "select * from " + TABLE_NAME + " order by Код_раб";
try {
state.execute(sql);
rs = state.getResultSet();
createTable();
filterFlag = false;
bFilter.setText("<html><h3>Фильтровать</h3></html>");
bAddRow.setEnabled(! filterFlag);
bRemoveRow.setEnabled(! filterFlag);
bSaveRow.setEnabled(! filterFlag);
bSort.setEnabled(! filterFlag);
bCustomSQL.setEnabled(! filterFlag);
table.setRowSelectionInterval(0, 0);
} catch (SQLException ex) {
}
}
}
});
}
/** Назначение действий для компонентов, реализующих выполнение SQL-запросов, введенных пользователем. */
private static void initCustomSQLCompsActions() {
/** Действие для кнопки выполнения SQL-запроса, введенного пользователем. */
bCustomSQL.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (! customSQLFlag) {
sql = taCustomSQL.getText();
if (sql.equals("")) {
JOptionPane.showMessageDialog(null, "Вы не ввели SQL-запрос.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
} else {
try {
customSQLFlag = true;
bCustomSQL.setText("<html><h2>Отмена</h2></html>");
bAddRow.setEnabled(! customSQLFlag);
bRemoveRow.setEnabled(! customSQLFlag);
bSaveRow.setEnabled(! customSQLFlag);
bSort.setEnabled(! customSQLFlag);
bFilter.setEnabled(! customSQLFlag);
table.setRowSelectionInterval(0, 0);
state.execute(sql);
rs = state.getResultSet();
createTable();
} catch (SQLException ex) {
JOptionPane.showMessageDialog(null, "Неверный запрос. Проверьте синтаксис.", "Ошибка!", JOptionPane.ERROR_MESSAGE);
}
}
} else {
sql = "select * from " + TABLE_NAME + " order by Код_раб";
try {
state.execute(sql);
rs = state.getResultSet();
createTable();
customSQLFlag = false;
bCustomSQL.setText("<html><h2>Выполнить запрос</h2></html>");
bAddRow.setEnabled(! customSQLFlag);
bRemoveRow.setEnabled(! customSQLFlag);
bSaveRow.setEnabled(! customSQLFlag);
bSort.setEnabled(! customSQLFlag);
bFilter.setEnabled(! customSQLFlag);
table.setRowSelectionInterval(0, 0);
} catch (SQLException ex) {
}
}
}
});
}
Приложение B. Экранные формы
Рисунок B1 - Главная форма приложения с выбранной вкладкой Персонал
Рисунок B2 - Процесс редактирования поля таблицы Производство
Рисунок B3 - Результат применения фильтра для таблицы Производство
Рисунок B4 - Выполнение SQL-запроса пользователя для таблицы Продукция
Приложение C. Диалоговые окна и сообщения пользователю
Рисунок C1 - Всплывающее окно ошибки отсутствия записей в таблице
Рисунок C2 - Всплывающее окно ошибки синтаксиса SQL-запроса
Рисунок C3 - Всплывающее окно ошибки отсутствия вводимого SQL-запроса
Размещено на Allbest.ru
Подобные документы
Особенности архитектуры Java. Технология Java Database Connectivity. Кроссплатформенность Java-приложений. Преимущества языка программирования. Логическая структура базы данных. Структура программного комплекса. Верификация программных средств.
курсовая работа [962,8 K], добавлен 13.01.2016Назначение базы данных для обеспечения работы автобусного парка. Основные возможности админпанели. Выполняемые базой данных и приложением функции. Инфологическое моделирование данных. Описание разработанного web-приложения. Проектирование базы данных.
курсовая работа [2,2 M], добавлен 01.02.2013Разработка приложения, позволяющего автоматизировать документооборот предприятия по списанию основных средств. Мероприятия по защите и обеспечению целостности базы данных. Разработка клиентского приложения. Запросы к базе данных, руководство пользователя.
курсовая работа [700,0 K], добавлен 14.01.2015Создание программ, позволяющих создавать базы данных. Создание таблицы базы данных. Создание схемы данных. Создание форм, отчетов, запросов. Увеличение объема и структурной сложности хранимых данных. Характеристика системы управления базой данных Access.
курсовая работа [2,1 M], добавлен 17.06.2013История развития языка программирования Java. История тетриса - культовой компьютерной игры, изобретённой в СССР. Правила проведения игры, особенности начисления очков. Создание интерфейса программы, ее реализация в среде Java, кодирование, тестирование.
курсовая работа [168,1 K], добавлен 27.09.2013Разработка базы данных организации, которая занимается ремонтом автомобилей и реализована в виде программного продукта. Моделирование структуры баз данных с использованием CASE-средств средствами языка SQL. Разработка логической и физической модели базы.
курсовая работа [2,3 M], добавлен 21.03.2010Концептуальное и инфологическое проектирование базы данных в системе управления базами данных Microsoft Access. Физическое проектирование базы данных "Магазин спорттоваров". Тестирование и отладка базы данных, составление руководства пользователя.
курсовая работа [6,7 M], добавлен 22.11.2022Разработка web-приложения для оперирования данными с помощью базы данных и web-браузера в качестве клиента пользователя. Основные преимущества языка программирования Java. Осуществление редактирования, добавления информации и поиска по архивам данных.
дипломная работа [2,1 M], добавлен 30.09.2016Проектирование логической структуры базы данных методом нормальных форм, сущность связь. Сравнительный анализ спроектированной базы данных и базы данных существующих информационных систем. Выбор и обоснование состава технических и программных средств.
курсовая работа [3,0 M], добавлен 22.12.2014Особенности проектирования программы на языке С++ для обработки данных из таблиц базы данных. Основные функции программы, создание концептуальной модели базы данных и диаграммы классов, разработка интерфейса пользователя и запросов к базе данных.
курсовая работа [2,1 M], добавлен 08.06.2012