Копирование текста из текстового поля из одного класса в другой. (Джава) - PullRequest
0 голосов
/ 14 января 2019

Итак, я хочу использовать текст из текстового поля в одном классе в другом классе, но у меня возникают проблемы при его передаче. Я более или менее хочу использовать его в запросе SQL, чтобы получить ту же информацию о пользователе из другой таблицы. Это первый бит моего класса входа в систему. Второй класс TaskViewer. Мне нужно содержимое из textFieldUN в Login, чтобы перейти к TaskViewer, чтобы я мог получить доступ к правильной информации о пользователе каждый раз, когда какой-то конкретный пользователь входит в систему. Спасибо за любую помощь! Пожалуйста, скажите мне, если мне не ясно, я постараюсь объяснить лучше. Извините, впервые пользуюсь этим сайтом!

public class Login {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Login window = new Login();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
Connection connection = null;
private JTextField textFieldUN;
private JPasswordField passwordField;

/**
 * Create the application.
 */
public Login() {
    initialize();
    connection = sqliteConnection.dbConnector(); 
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 667, 399);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    JLabel lblNewLabel = new JLabel("Username:");
    lblNewLabel.setBounds(234, 95, 75, 27);
    frame.getContentPane().add(lblNewLabel);

    JLabel lblNewLabel_1 = new JLabel("Password:");
    lblNewLabel_1.setBounds(234, 162, 75, 27);
    frame.getContentPane().add(lblNewLabel_1);

    textFieldUN = new JTextField();
    textFieldUN.setBounds(321, 95, 232, 39);
    frame.getContentPane().add(textFieldUN);
    textFieldUN.setColumns(10);


    JButton btnNewButton = new JButton("Login");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            try {
                String query = "SELECT * FROM  User_Info WHERE Username = ? and Password = ?"; //index 1 for UN 2 for PW
                PreparedStatement pst = connection.prepareStatement(query); //Must pass query
                pst.setString(1, textFieldUN.getText() ); //UN get
                pst.setString(2, passwordField.getText() ); //PW get //it is crossed put because of the password masking
                ResultSet rs = pst.executeQuery();
                //String userNameEntered = textFieldUN.getText();



                int count = 0;
                while(rs.next()) {
                    count = count +1;
                }
                    if (count == 1)
                    {
                        JOptionPane.showMessageDialog(null, "User name and password is correct!");
                        frame.dispose();
                        TaskViewer tskvwr = new TaskViewer();
                        tskvwr.setVisible(true);
                    }
                    else if(count > 1)
                    {
                        JOptionPane.showMessageDialog(null, "Duplicated user name and password!");
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "User name or password is incorrect!");
                    }
                    rs.close();
                    pst.close();
            }catch(Exception e) 
            {
                JOptionPane.showMessageDialog(null, e);

            }

        }

    });
    btnNewButton.setBounds(415, 244, 138, 39);
    frame.getContentPane().add(btnNewButton);

    passwordField = new JPasswordField();
    passwordField.setBounds(321, 156, 232, 39);
    frame.getContentPane().add(passwordField);
}

}

public class TaskViewer extends JFrame {

private JPanel contentPane;
private JTable table;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                TaskViewer frame = new TaskViewer();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
Connection connection = null;
public TaskViewer() {
    connection = sqliteConnection.dbConnector(); //need to connect to db
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 602, 402);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    JButton btnLoadTable = new JButton("Load Task");
    btnLoadTable.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            try {
                 //String usernameretrieved = .UsernameRetriever()
                String query = "SELECT * FROM Task WHERE Username = ?";//I need to only get the task from a singular user from login
// WHERE I WANT TO USE THE TEXT BOX TO QUERY, I KNOW ? IS WRONG
                PreparedStatement pst = connection.prepareStatement(query);
                pst.setString(1, textFieldUN.getText() );
                ResultSet rs = pst.executeQuery();
                table.setModel(DbUtils.resultSetToTableModel(rs)); //DbUtil is from rs2

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    });
    btnLoadTable.setBounds(34, 41, 97, 25);
    contentPane.add(btnLoadTable);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(177, 41, 376, 248);
    contentPane.add(scrollPane);

    table = new JTable();
    scrollPane.setViewportView(table);
}
}

public class sqliteConnection {

        Connection conn = null;
        public static Connection dbConnector()
        {
            try {
                Class.forName("org.sqlite.JDBC");
                Connection conn = DriverManager.getConnection("jdbc:sqlite:C:\\Users\\a pathway
                //JOptionPane.showMessageDialog(null, "Connection is up and running!");
                return  conn;
            }catch(Exception e) 
            {
                JOptionPane.showMessageDialog(null, e);
                return null; 
            }

        }
}

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я знаю, что вы нашли свое решение, но я подумал, что вы можете найти это полезным. Мне кажется, вам просто нужен механизм ввода логина (имени пользователя и пароля), и, как только вы получите эту информацию, вы сможете соответственно с ней справиться. В этом случае (на мой взгляд) самый простой способ справиться со сценарием входа в систему - это использовать пользовательский модальный диалог. Перед тем, как приложение станет видимым, Логин должен быть удовлетворен, и то, как все выполняется, зависит от вас и вашего кода. Все, что вам нужно, - это предоставить пользователю возможность ввести имя и пароль для проверки, прежде чем ваше приложение попадет в поле зрения. В общем, так оно и всегда работает:

Login Dialog

А вот исполняемый код, который содержит метод, который генерирует и отображает диалоговое окно входа в систему выше. Код - ваш собственный класс 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 . Небольшой фрагмент кода в ссылке показывает, насколько легко его использовать. И вы уже знаете об информировании Пользователя о том, что введенные имя и пароль уже были использованы, это пустяк.

0 голосов
/ 14 января 2019

Вот очень простое приложение. Здесь я использую JDialog для отображения панели входа в систему и сохраняю управление программой до тех пор, пока пользователь не войдет в систему.

public class LoginPanel extends JPanel {

private String userName = null;
private JDialog dialog;

public LoginPanel(JDialog d) {
    dialog = d;
    // call initialize method to build your GUI here
    // don't forget to attach the ActionListener methods to the correct buttons
}

private void closeWindow() {
    dialog.dispose();
}

public String getUserName() {
    return userName;
}

private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String userInput = userNameTextField.getText();
    // validate user input here

    // if it's good, set username variable and call closeWindow
    userName = userInput;
    closeWindow();
}                                        

private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
    userName = null;
    closeWindow();
} 
}

Тогда это ваше основное приложение JFrame с основным классом

public class TaskViewer extends JFrame {

private static String userName = null;

public TaskViewer() {
    // call initialize method that builds your GUI here
    // don't forget to attach the formWindowOpened WindowListener to your JFrame
}

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
    initLogin();
}                                 

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new TaskViewer().setVisible(true);
        }
    });
}

public void initLogin() {
    JDialog dialog = new JDialog(this, "Login", 
        Dialog.ModalityType.APPLICATION_MODAL); /* this modality setting will keep
                                                   focus on the dialog until the OK
                                                   or Cancel button is clicked */
    LoginPanel login = new LoginPanel(dialog);
    dialog.add(login);
    dialog.pack();
    dialog.setLocationRelativeTo(this);
    dialog.setVisible(true);// this passes control to your dialog window

    // program will resume here once the dialog is destroyed
    userName = login.getUserName();
    if(userName == null) {
        // do error checking here
    } else {
        // you're good, let's use the program!
    }
}
}

Дополнительное замечание о безопасности: вы никогда не должны сообщать пользователю об ошибке, что он ввел дублирующиеся имя пользователя и пароль, потому что вы просто сказали ему имя и пароль другого пользователя ...

...