Я знаю, что вы нашли свое решение, но я подумал, что вы можете найти это полезным. Мне кажется, вам просто нужен механизм ввода логина (имени пользователя и пароля), и, как только вы получите эту информацию, вы сможете соответственно с ней справиться. В этом случае (на мой взгляд) самый простой способ справиться со сценарием входа в систему - это использовать пользовательский модальный диалог. Перед тем, как приложение станет видимым, Логин должен быть удовлетворен, и то, как все выполняется, зависит от вас и вашего кода. Все, что вам нужно, - это предоставить пользователю возможность ввести имя и пароль для проверки, прежде чем ваше приложение попадет в поле зрения. В общем, так оно и всегда работает:
А вот исполняемый код, который содержит метод, который генерирует и отображает диалоговое окно входа в систему выше. Код - ваш собственный класс TaskView с некоторыми изменениями и добавленными методами. Класс входа здесь полностью исключен , но ваш sqliteConnection класс остается прежним, за исключением того, что он был переименован в SQLiteConnection :
<code>/*
In this modified example, the Database connection is opened
and closed before and after every DB access operation. I don't
think Connection Pooling is required here....yet.
The image used in the Login Dialog can be downloaded from here:
https://www.freeiconspng.com/img/3059
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
public class TaskViewer extends JFrame {
// Class global member variables
private String applicationUserName; // Will hold the logged in User Name.
private String applicationUserPassword; // Will hold the Logged in User Password.
// Constructor
public TaskViewer() {
// Keep it tidy and simple.
initializeTaskViewer();
}
/**
* Launch the application.
* @param args
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
new TaskViewer().startApp(); // Don't need static methods this way.
}
catch (Exception e) {
e.printStackTrace();
}
}
});
}
private void startApp() {
/*
View the TaskView application window. The Event Dispatch
Thread (EDT) doesn't actually let this happen until this
method is finished so, all you will see is the Login Dialog
when the application starts and validation is satisfied.
Since we extend JFrame in this Class, we don't have to
instantiate as new TaskView. Doing so will just wipe out the
class member variables we had set with our Login Dialog
since it would now be a new instance of TaskView.
*/
setVisible(true);
String message = "<html>Please supply your Login information. If "
+ "you are<br>a New User then you will be automatically added<br>"
+ "to the database.<br><br><br>";
String title = "TaskView - User Login ...";
String userNameCaption = null; //"User Name:";
String passwordCaption = null; //"Password:";
String footNoteCaption = "<html><pre><font size=2> "
+ "Select <font color=red>Cancel</font> to quit</font>
";
Color backColor = Color.decode ("# ffe6cc"); // наш собственный цвет фона.
// Объект dialogImage = JOptionPane.QUESTION_MESSAGE; // Вы можете сделать это так ...
// или так ...
Object dialogImage = "login-icon-3059.png | 80,80"; // получаем изображение из:
https://www.freeiconspng.com/img/3059
// Текстовые подписи для наших диалоговых кнопок
Object [] buttonCaptions = {"
Войти В TaskView ",
"
Отмена - Выход "};
// Звонок в наш диалог входа в систему
String [] loginPass = customLoginInputBox (null, сообщение, заголовок, userNameCaption, passwordCaption,
footNoteCaption, backColor, dialogImage, buttonCaptions);
/ * Звонок может очень хорошо выглядеть следующим образом ...
String [] loginPass = customLoginInputBox (ноль, сообщение, заголовок, ноль, ноль, ноль, ноль, ноль, ноль);
... но диалог выглядит довольно мягко; p * /
if (loginPass [0] == null) {
JOptionPane.showMessageDialog (это «Вход в систему не поддерживается! Выход ...»,
«Неверный логин», JOptionPane.WARNING_MESSAGE);
System.exit (0);
}
еще {
applicationUserName = loginPass [0];
applicationUserPassword = loginPass [1];
}
логическое значение valid = validateLogin (applicationUserName, applicationUserPassword);
if (! valid) {
System.exit (0);
}
}
private void initializeTaskViewer () {
setTitle ("TaskView v1.0.0");
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setBounds (100, 100, 602, 402);
JPanel contentPane = новый JPanel ();
contentPane.setBorder (новый EmptyBorder (5, 5, 5, 5));
setContentPane (ContentPane);
contentPane.setLayout (нуль);
JTable table = new JTable ();
JButton btnLoadTable = new JButton («Загрузить задачи»);
btnLoadTable.addActionListener (новый ActionListener () {
@Override
public void actionPerformed (ActionEvent arg0) {
Соединение соединение = ноль;
пытаться {
connection = SQLiteConnection.dbConnector ();
String query = "SELECT * FROM Task WHERE Имя пользователя =?";
PreparedStatement pst = connection.prepareStatement (query);
pst.setString (1, applicationUserName);
ResultSet rs = pst.executeQuery ();
// Не требуется зависимость от DbUtil с этим небольшим предоставленным методом.
resultSetToJTable (table, rs);
//table.setModel(DbUtils.resultSetToTableModel(rs)); // DbUtil от rs2
}
поймать (исключение е) {
Logger.getLogger (TaskViewer.class.getName ()). Log (Level.SEVERE, null, e);
}
в конце концов {пытаться {
// Закрытие соединения будет автоматически
// закрываем pst и rs.
if (connection! = null) {connection.close (); }
}
catch (SQLException ex) {
Logger.getLogger (TaskViewer.class.getName ()). Log (Level.SEVERE, null, ex);
}
}
}
});
btnLoadTable.setBounds (34, 41, 100, 25);
contentPane.add (btnLoadTable);
JScrollPane scrollPane = новый JScrollPane (таблица);
scrollPane.setBounds (177, 41, 376, 248);
contentPane.add (ScrollPane);
// Установить окно приложения в центре экрана.
// Должно быть сделано перед использованием setVisible ().
setLocationRelativeTo (нуль);
}
/ **
* Отображает модальное диалоговое окно пользовательского ввода, где имя пользователя и пароль
* могут быть поставлены.
*
* @param component (Component) Родительский компонент, откуда
* диалог будет отображаться с. Нулевая банка
* будет предоставлено, если нет очевидного родителя
* составная часть. Если указан ноль, тогда родитель
* временно создан для обеспечения видимости
* и затем утилизируется, когда сделано.
*
* @param message (String) Тело сообщения для отображения в
* Диалог входа в систему. Длина сообщения
* строки (до и после разрыва строки) могут
* определить, насколько большим будет диалог.
* Использование разрывов строк может быть уместным
* Вот. HTML может быть использован для создания вашего
* сообщение.
*
* @param title (String) Заголовок, отображаемый в
* строка заголовка окна диалога входа в систему. Только
* здесь можно использовать простой текст.
*
* @param userNameBoxCaption (String) Текстовое поле ввода имени пользователя
* содержит текстовую подпись слева от него, так
* чтобы указать, для чего предназначена коробка ввода. От
* по умолчанию эта надпись гласит: «Имя пользователя:».
* Если вы хотите изменить заголовок по умолчанию
* тогда вы можете поставить его здесь. Если вы предпочитаете
* чтобы использовать значение по умолчанию, просто введите ноль.
* HTML можно использовать здесь.
*
* @param passwordBoxCaption (String) Текстовое поле ввода пароля
* содержит текстовую подпись слева от него, так
* чтобы указать, для чего предназначена коробка ввода. От
* по умолчанию эта надпись гласит: «Пароль:». Если
* затем вы хотите изменить заголовок по умолчанию
* Вы можете поставить его здесь. Если вы предпочитаете использовать
* по умолчанию, тогда просто введите ноль. HTML
* можно использовать здесь.
*
* @param dialogFootNoteCaption (string) По умолчанию нижний колонтитул отсутствует
* подпись. Подпись текста нижнего колонтитула
* отображается ниже и между паролем
* поле ввода и кнопки диалога, расположенные по адресу
* нижняя часть диалога. Любые дополнительные
* информация может быть предоставлена здесь при желании.
* HTML можно использовать и здесь.
** @param dialogBackColor (Color) Вы можете установить желаемый фон
* цвет для вашего логина. По умолчанию
* будет цветом окна сообщения по умолчанию для
* ваша конкретная операционная система или
* независимо от того, как выглядит и чувствует себя в настоящее время используется
* ваше приложение. Любой цвет может быть предоставлен
* до тех пор, пока он поставляется в цвете
* Объект.
*
* @param dialogImage (Object) Этот параметр немного особенный.
* По умолчанию стандартный вопрос JOptionPane
* Значок сообщения отображается слева
* Диалог входа в систему. Если вы хотите изменить
* этот значок для любого другого
* Значки JOptionPane, то вы можете просто поставить
* любой из них здесь в виде:
*
* JOptionPane.ERROR_MESSAGE;
* JOptionPane.INFORMATION_MESSAGE
* JOptionPane.PLAIN_MESSAGE
* JOptionPane.QUESTION_MESSAGE
* JOptionPane.WARNING_MESSAGE
*
* Однако если вы хотите использовать собственное изображение (прозрачное
* background .png лучше), тогда вы можете указать путь и имя файла
* ваше изображение с этим параметром в виде строки. Вы также можете по желанию
* конкретный размер для вашего изображения, поместив разделитель (|) в конце
* строки пути и предоставления целочисленных значений для ширины и высоты, для
* пример:
*
*
* "C:\\My App Path\\Images\\logo.png|80,80"
*
* В приведенном выше примере пути к изображению мы говорим методу изменения размера
* изображение до 80 пикселей в ширину и 80 пикселей в высоту. Разделитель используется для
* разделить ширину и высоту в приведенной выше строке пути запятой (,), но
* вполне может быть пробелом, точкой с запятой (;) или двоеточием (:). Кто-нибудь
* из четырех будет работать как разделитель ширины / высоты.
*
* Этот параметр будет принимать либо целочисленное значение, либо строковое значение. Если
* предоставляется целочисленное значение, тогда предполагается, что значок JOptionPane
* в комплект поставки. Если указано строковое значение, предполагается, что
* это путь к пользовательскому файлу изображения, расположенному в локальном файле
* система.
*
* @param dialogButtonCaptions (одномерный (1D) объект [] массив)
* В логине есть только две кнопки
* Диалог и по умолчанию они "ОК" и
* Кнопки «Отмена» (отмена имеет фокус по умолчанию).
* Оба по умолчанию содержат вышеупомянутое
* соответствующие текстовые подписи. Если хотите
* изменить заголовки этих кнопок, то вы можете сделать
* так вот, предоставляя массив объектов
* заголовки кнопок, например:
*
* Object[] buttonCaptions = {"Login To App", "Cancel/Quit"};
*
* HTML может использоваться в строках заголовка.
*
* @return (одномерный (1D) String [] Array) Возвращаемая строка
* массив будет содержать только два конкретных элемента,
* Логин и предоставленный пароль. Если ноль в одном или обоих
* элементы возвращаются, тогда диалог был отменен (самый правый
* кнопка выбрана) или диалог был закрыт с диалоговым окном
* закрыть кнопку [x]. Диалог не может быть закрыт без надлежащего
* Учетные данные (имя и пароль) предоставляются или диалоговое окно
* отменено
* /
public String [] customLoginInputBox (Компонентный компонент, Строковое сообщение, Строковый заголовок,
Строка userNameBoxCaption, Строка passwordBoxCaption,
Строка dialogFootNoteCaption, Цвет dialogBackColor,
Object dialogImage, Object [] dialogButtonCaptions) {String [] result = {null, null};
Object [] buttonCaptions = {"OK", "Cancel"};
if (dialogButtonCaptions! = null && dialogButtonCaptions.length> 0) {
buttonCaptions = Arrays.copyOf (dialogButtonCaptions, dialogButtonCaptions.length);
}
Компонент комп = компонент;
JFrame iFRAME = new JFrame ();
if (comp == null) {
/ * Создать фиктивный JFrame. Это сделано для того, чтобы
Диалоговое окно, которое используется в приложении
не скрывается за формой IDE или ON TOP, если
null используется для родительского компонента. Не
проблема для некоторых.
* /
iFRAME.setAlwaysOnTop (истина);
comp = iFRAME;
}
String userNameCaption = "Имя пользователя:"; // заголовок по умолчанию
if (userNameBoxCaption! = null &&! userNameBoxCaption.equals ("")) {
userNameCaption = userNameBoxCaption;
}
String passwordCaption = "Пароль:"; // заголовок по умолчанию
if (passwordBoxCaption! = null &&! passwordBoxCaption.equals ("")) {
passwordCaption = passwordBoxCaption;
}
// Сноска диалога по умолчанию (без сноски).
Строка footNote = dialogFootNoteCaption == null
|| dialogFootNoteCaption.equals ("")? "": dialogFootNoteCaption;
String uName = "";
String passWrd = "";
// Установить белый цвет фона диалога.
Color origPanelColor = (Color) UIManager.get ("OptionPane.background");
Color origPaneBackgroundColor = (Color) UIManager.get ("Panel.background");
if (dialogBackColor! = null) {
пытаться {
UIManager.setLookAndFeel (UIManager.getCrossPlatformLookAndFeelClassName ());
UIManager.put ("OptionPane.background", dialogBackColor);
UIManager.put ("Panel.background", dialogBackColor);
}
catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
Logger.getLogger («Ошибка метода customLoginInputBox ()!»). Log (Level.SEVERE, null, ex);
}
}
// Получить ввод пользователя как имя пользователя и пароль.
// используя пользовательский диалог ввода ...
// Создание диалоговой панели входа в систему ...
BorderLayout layout = new BorderLayout ();
JPanel панель = новая JPanel (макет);
panel.setBackground (dialogBackColor);
JLabel label = new JLabel (сообщение);
panel.add (метка, BorderLayout.NORTH);
JPanel p = новый JPanel (новый BorderLayout (5, 5));
p.setBackground (dialogBackColor);
Ярлыки JPanel = новый JPanel (новый GridLayout (0, 1, 2, 2));
labels.setBackground (dialogBackColor);
label.add (новый JLabel (userNameCaption, SwingConstants.RIGHT));
label.add (новый JLabel (passwordCaption, SwingConstants.RIGHT));
p.add (метки, BorderLayout.WEST);
Элементы управления JPanel = новый JPanel (новый GridLayout (0, 1, 2, 2));
controls.setBackground (dialogBackColor);
JTextField userName = new JTextField ();
controls.add (Username);
JPasswordField password = new JPasswordField ();
controls.add (пароль);
p.add (control, BorderLayout.CENTER);
panel.add (р);
JLabel baseLabel = новый JLabel (footNote);
panel.add (baseLabel, BorderLayout.SOUTH);
// Пользовательское изображение для использования в диалоге входа ...
ImageIcon icon = null;
int msgType = JOptionPane.QUESTION_MESSAGE;
if (dialogImage! = null && dialogImage.getClass (). getSimpleName (). toUpperCase (). equals ("STRING")) {
String dString = dialogImage.toString ();
int sizeWidth = 0, sizeHeight = 0;
if (dString.contains ("|")) {
String [] dsTmp = dString.split ("\\ |");
dString = dsTmp [0];
if (dsTmp [1] .contains (",") || dsTmp [1] .contains (";")|| dsTmp [1] .contains (":") || dsTmp [1] .contains ("")) {
пытаться {
sizeWidth = Integer.parseInt (dsTmp [1] .split (", |; |: | \\ s +") [0]);
sizeHeight = Integer.parseInt (dsTmp [1] .split (", |; |: | \\ s +") [1]);
}
поймать (исключение е) {
}
}
}
icon = новый ImageIcon (dString);
if (sizeWidth == 0) {
sizeWidth = icon.getIconWidth ();
}
if (sizeHeight == 0) {
sizeHeight = icon.getIconHeight ();
}
Изображение image = icon.getImage ();
// Размер, который вы хотите (этот пример использует: 128 х 128).
Изображение newimg = image.getScaledInstance (sizeWidth, sizeHeight, java.awt.Image.SCALE_SMOOTH);
icon = новый ImageIcon (newimg);
}
иначе if (dialogImage! = null && dialogImage.getClass (). getSimpleName (). toUpperCase (). equals ("INTEGER")) {
msgType = (int) dialogImage;
}
// Получить ввод от пользователя. Это будет отображать
// ваш пользовательский диалог ввода.
while (uName.equals ("") || passWrd.equals ("")) {
int res = JOptionPane.showOptionDialog (iFRAME, панель, заголовок,
JOptionPane.OK_CANCEL_OPTION, msgType, icon, buttonCaptions, buttonCaptions [1]);
// Обрабатываем результат из нашего пользовательского диалогового окна ввода
if (res == JOptionPane.OK_OPTION &&! userName.getText (). equals ("")
&&! Arrays.toString (password.getPassword ()). Equals ("")) {
uName = userName.getText ();
char [] pass = password.getPassword ();
for (int i = 0; i
*
* @param table (JTable) Имя переменной JTable для заполнения.
*
* @param rs (ResultSet) ResultSet для заполнения JTable.
* /
public void resultSetToJTable (таблица JTable, ResultSet rs) {
пытаться {
DefaultTableModel tableModel = new DefaultTableModel ();
ResultSetMetaData metaData = rs.getMetaData ();
int columnCount = metaData.getColumnCount ();
for (int columnIndex = 1; columnIndex
Скопируйте и вставьте приведенный выше код в новый проект , а также добавьте свой класс SQLiteConnection с соответствующей информацией базы данных, затем запустите приложение, чтобы увидеть, как оно работает. Не забудьте также добавить библиотеку драйвера SQLite JDBC в этот новый проект.
Обратите внимание, хотя здесь и сделано, пароли никогда не должны храниться в виде простого текста, а вместо этого должен храниться хэш этого пароля. Никто, кроме Пользователя, никогда не должен знать, каким может быть его пароль. Это должен быть хеш (с солью) предоставленного пароля по сравнению с хешем, который хранится в таблице базы данных. Даже ты не должен знать пароль. Изучите использование BCrypt или jBCrypt . Небольшой фрагмент кода в ссылке показывает, насколько легко его использовать. И вы уже знаете об информировании Пользователя о том, что введенные имя и пароль уже были использованы, это пустяк.