Я пытался написать графический интерфейс для тестирования соединения JDBC, использующего JComboBox для выбора диска, такого как MySQL или PostgreSQL. Существует также несколько JTextFields для вставки хоста, порта, базы данных, имени пользователя и т. Д., Поэтому я могу использовать его в своих будущих проектах.
GUI для тестового соединения JDBC У меня есть класс дляЧасть GUI и другие классы для действий, но кнопка, которая проверяет соединение, должна получить доступ к JComboBox
и всем JTextField
s, чтобы попробовать Connection
. Я сделал protected static
мои переменные, чтобы я мог получить доступ из основного класса графического интерфейса, но я считаю, что это плохая идея, и я ХОЧУ, ЧТО МОЖЕТ ЛЕГКО ПРОЧИТАТЬ И ЛЕГКО переписать в будущем.
Вотосновной класс графического интерфейса.
public Class JDBCManager extends JPanel {
protected static JButton jButtonTest;
protected static ArrayList<String[]> arrayListDrivers;
protected static JComboBox jComboBoxDriver;
protected static JTextField jTextFieldHost;
protected static JTextField jTextFieldPort;
protected static JTextField jTextFieldDatabase;
protected static JTextField jTextFieldUsername;
protected static JPasswordField jPasswordFieldPassword;
protected static JTextField jTextFieldURL;
public JProgressBar jProgressBar;
protected static JButton jButtonOK;
protected static JButton jButtonCancel;
/**
* Initializes all the components in the GUI.
*/
public JDBCManager() {
// Local variables
JLabel jLabelDriver = new JLabel();
JLabel jLabelHost = new JLabel();
JLabel jLabelPort = new JLabel();
JLabel jLabelDatabase = new JLabel();
JLabel jLabelUsername = new JLabel();
JLabel jLabelPassword = new JLabel();
JLabel jLabelURL = new JLabel();
arrayListDrivers = new ArrayList<String[]>();
jComboBoxDriver = new JComboBox();
jTextFieldHost = new JTextField();
jTextFieldPort = new JTextField();
jTextFieldDatabase = new JTextField();
jTextFieldUsername = new JTextField();
jPasswordFieldPassword = new JPasswordField();
jTextFieldURL = new JTextField();
jProgressBar = new JProgressBar();
jButtonTest = new JButton();
jButtonOK = new JButton();
jButtonCancel = new JButton();
ResourceBundle resourceBundle = ResourceBundle.getBundle("internationalization/JDBCManager/Messages", Locale.getDefault());
// Get default font
Font font = UIManager.getDefaults().getFont("Label.font");
jLabelDriver.setText(resourceBundle.getString("DRIVER NAME:"));
jLabelDriver.setHorizontalAlignment(JLabel.LEFT);
jLabelHost.setText(resourceBundle.getString("HOST:"));
jLabelHost.setHorizontalAlignment(JLabel.LEFT);
jLabelPort.setText(resourceBundle.getString("PORT:"));
jLabelPort.setHorizontalAlignment(JLabel.LEFT);
jLabelDatabase.setText(resourceBundle.getString("DATABASE NAME:"));
jLabelDatabase.setHorizontalAlignment(JLabel.LEFT);
jLabelUsername.setText(resourceBundle.getString("USERNAME:"));
jLabelUsername.setHorizontalAlignment(JLabel.LEFT);
jLabelPassword.setText(resourceBundle.getString("PASSWORD:"));
jLabelPassword.setHorizontalAlignment(JLabel.LEFT);
jLabelURL.setText(resourceBundle.getString("DATABASE URL:"));
jLabelURL.setHorizontalAlignment(JLabel.LEFT);
jComboBoxDriver.addActionListener(new DatabaseDriver());
JTextComponent[] jTextComponents = new JTextComponent[] {
jTextFieldHost,
jTextFieldPort,
jTextFieldDatabase,
jTextFieldURL,
jTextFieldUsername};
JComponent[] jComponents = new JComponent[] {jButtonTest, jButtonOK};
TextComponentInputVerifier textComponentImputVerifier = new TextComponentInputVerifier(jTextComponents, jComponents);
jTextFieldHost.addCaretListener(new DatabaseURLVerifier());
jTextFieldHost.addCaretListener(textComponentImputVerifier);
jTextFieldHost.setTransferHandler(null);
jTextFieldHost.setColumns(30);
jTextFieldPort.addCaretListener(new DatabaseURLVerifier());
jTextFieldPort.addCaretListener(textComponentImputVerifier);
jTextFieldPort.addKeyListener(new TextDataInputVerifier(TextDataInputVerifier.NUMERICAL));
jTextFieldPort.addKeyListener(new TextLengthInputVerifier(5));
jTextFieldPort.addKeyListener(new TextNumberRangeInputVerifier(1, 65535));
jTextFieldPort.setTransferHandler(null);
jTextFieldPort.setColumns(30);
jTextFieldDatabase.addCaretListener(new DatabaseURLVerifier());
jTextFieldDatabase.addCaretListener(textComponentImputVerifier);
jTextFieldDatabase.setTransferHandler(null);
jTextFieldDatabase.setColumns(30);
jTextFieldUsername.addCaretListener(textComponentImputVerifier);
jTextFieldUsername.setTransferHandler(null);
jTextFieldUsername.setColumns(30);
jPasswordFieldPassword.addCaretListener(textComponentImputVerifier);
jPasswordFieldPassword.setTransferHandler(null);
jPasswordFieldPassword.setColumns(30);
jTextFieldURL.addCaretListener(textComponentImputVerifier);
jTextFieldURL.setTransferHandler(null);
jTextFieldURL.setColumns(30);
jProgressBar.setStringPainted(true);
jProgressBar.setString("");
jProgressBar.setFont(new Font(font.getName(), Font.BOLD | Font.ITALIC, 16));
jButtonTest.setText(resourceBundle.getString("TEST DATABASE CONNECTION"));
jButtonTest.addActionListener(new DatabaseAction());
jButtonOK.setText(resourceBundle.getString("OK"));
jButtonCancel.setText(resourceBundle.getString("CANCEL"));
GridBagConstraints gbc = new GridBagConstraints();
JPanel jPanel = new JPanel();
jPanel.setLayout(new GridBagLayout());
gbc.fill = GridBagConstraints.HORIZONTAL;
jPanel.add(jLabelDriver, gbc);
jPanel.add(jComboBoxDriver, gbc);
gbc.gridy = 1;
jPanel.add(jLabelHost, gbc);
jPanel.add(jTextFieldHost, gbc);
gbc.gridy = 2;
jPanel.add(jLabelPort, gbc);
jPanel.add(jTextFieldPort, gbc);
gbc.gridy = 3;
jPanel.add(jLabelDatabase, gbc);
jPanel.add(jTextFieldDatabase, gbc);
gbc.gridy = 4;
jPanel.add(jLabelUsername, gbc);
jPanel.add(jTextFieldUsername, gbc);
gbc.gridy = 5;
jPanel.add(jLabelPassword, gbc);
jPanel.add(jPasswordFieldPassword, gbc);
gbc.gridy = 6;
jPanel.add(jLabelURL, gbc);
jPanel.add(jTextFieldURL, gbc);
gbc.gridy = 7;
gbc.gridwidth = GridBagConstraints.REMAINDER;
jPanel.add(jButtonTest, gbc);
gbc.gridy = 8;
jPanel.add(jProgressBar, gbc);
JPanel jPanelButtons = new JPanel();
jPanelButtons.add(jButtonOK);
jPanelButtons.add(jButtonCancel);
setLayout(new BorderLayout());
add(jPanel, BorderLayout.CENTER);
add(jPanelButtons, BorderLayout.SOUTH);
}
}
А вот и мой ActionListener
класс.
public final class DatabaseTestConnection extends Thread {
/**
* Sets the current thread priority minor to the normal priority to not interfere
* with other threads with normal priority and then starts the current thread.
*/
protected DatabaseTestConnection() {
setPriority(NORM_PRIORITY - 1);
start();
}
/**
* Performs the run of this current thread in order to control different GUI
* components when the testing database connection button is pressed.
*
* <p>
* When the database testing operation ends, those components are
* restored to it's previous state.
* </p>
*/
@Override
public void run() {
ResourceBundle resourceBundle = ResourceBundle.getBundle("internationalization/DatabaseTestConnection/Messages", Locale.getDefault());
// Get all the caret listeners from the text components
CaretListener[] caretListenerHost = JDBCManager.jTextFieldHost.getCaretListeners();
CaretListener[] caretListenerPort = JDBCManager.jTextFieldPort.getCaretListeners();
CaretListener[] caretListenerDatabase = JDBCManager.jTextFieldDatabase.getCaretListeners();
CaretListener[] caretListenerUsername = JDBCManager.jTextFieldUsername.getCaretListeners();
CaretListener[] caretListenerPassword = JDBCManager.jPasswordFieldPassword.getCaretListeners();
CaretListener[] caretListenerURL = JDBCManager.jTextFieldURL.getCaretListeners();
// Remove all the caret listeners for each text component
// to prevent user selection of text field and enable the
// buttons while testing the database connection
// Add all the caret listeners for each text component
removeAllCaretListeners(JDBCManager.jTextFieldHost, caretListenerHost);
removeAllCaretListeners(JDBCManager.jTextFieldPort, caretListenerPort);
removeAllCaretListeners(JDBCManager.jTextFieldDatabase, caretListenerDatabase);
removeAllCaretListeners(JDBCManager.jTextFieldUsername, caretListenerUsername);
removeAllCaretListeners(JDBCManager.jPasswordFieldPassword, caretListenerPassword);
removeAllCaretListeners(JDBCManager.jTextFieldURL, caretListenerURL);
JDBCManager.jComboBoxDriver.setEnabled(false);
JDBCManager.jTextFieldHost.setEnabled(false);
JDBCManager.jTextFieldPort.setEnabled(false);
JDBCManager.jTextFieldDatabase.setEnabled(false);
JDBCManager.jTextFieldUsername.setEnabled(false);
JDBCManager.jPasswordFieldPassword.setEnabled(false);
JDBCManager.jTextFieldURL.setEnabled(false);
JDBCManager.jButtonTest.setEnabled(false);
JDBCManager.jButtonOK.setEnabled(false);
JDBCManager.jButtonCancel.setEnabled(false);
JDBCManager.jProgressBar.setString(resourceBundle.getString("TESTING DATABASE CONNECTION..."));
JDBCManager.jProgressBar.setIndeterminate(true);
String url = JDBCManager.jTextFieldURL.getText();
String username = JDBCManager.jTextFieldUsername.getText();
String password = DigestPassword.digestPassword(JDBCManager.jPasswordFieldPassword.getPassword());
Connection connection = null;
try {
connection = DriverManager.getConnection(url, username, password);
} catch (SQLException ex) {
Logger.getLogger(DatabaseTestConnection.class.getName()).log(Level.SEVERE, null, ex);
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException ex) {
Logger.getLogger(DatabaseTestConnection.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
if (connection != null) {
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(
null,
resourceBundle.getString("THE CONNECTION TO THE DATABASE IS ESTABLISHED!"),
"JDBC Manager",
JOptionPane.INFORMATION_MESSAGE);
}
else {
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(
null,
resourceBundle.getString("THE CONNECTION TO THE DATABASE COULD NOT BE ESTABLISHED!"),
"JDBC Manager",
JOptionPane.WARNING_MESSAGE);
}
// Add all the caret listeners for each text component
addAllCaretListeners(JDBCManager.jTextFieldHost, caretListenerHost);
addAllCaretListeners(JDBCManager.jTextFieldPort, caretListenerPort);
addAllCaretListeners(JDBCManager.jTextFieldDatabase, caretListenerDatabase);
addAllCaretListeners(JDBCManager.jTextFieldUsername, caretListenerUsername);
addAllCaretListeners(JDBCManager.jPasswordFieldPassword, caretListenerPassword);
addAllCaretListeners(JDBCManager.jTextFieldURL, caretListenerURL);
// Enable all the components
JDBCManager.jComboBoxDriver.setEnabled(true);
JDBCManager.jTextFieldHost.setEnabled(true);
JDBCManager.jTextFieldPort.setEnabled(true);
JDBCManager.jTextFieldDatabase.setEnabled(true);
JDBCManager.jTextFieldUsername.setEnabled(true);
JDBCManager.jPasswordFieldPassword.setEnabled(true);
JDBCManager.jTextFieldURL.setEnabled(true);
JDBCManager.jButtonTest.setEnabled(true);
JDBCManager.jButtonOK.setEnabled(true);
JDBCManager.jButtonCancel.setEnabled(true);
JDBCManager.jProgressBar.setString("");
JDBCManager.jProgressBar.setIndeterminate(false);
}
/**
* Adds each event listener contained in a {@code CaretListener[]}
* to the {@code JTextComponent} specified both in the method parameters.
*
* @param jTextComponent the {@code JTextComponent} to add the events
* contained in the {@code CaretListener[]}.
* @param caretListener the {@code CaretListener[]} with the events
* to add to the {@code JTextComponent}.
*/
private void addAllCaretListeners(JTextComponent jTextComponent, CaretListener[] caretListener) {
for (int i = 0; i < caretListener.length; i++)
jTextComponent.addCaretListener(caretListener[i]);
}
/**
* Removes each event listener contained in a {@code CaretListener[]}
* from the {@code JTextComponent} specified both in the method parameters.
*
* @param jTextComponent the {@code JTextComponent} to remove the events
* contained in the {@code CaretListener[]}.
* @param caretListener the {@code CaretListener[]} with the events
* to remove from the {@code JTextComponent}.
*/
private void removeAllCaretListeners(JTextComponent jTextComponent, CaretListener[] caretListener) {
for (int i = 0; i < caretListener.length; i++)
jTextComponent.removeCaretListener(caretListener[i]);
}
}
Итак, как я уже говорил, я хочу узнать, как лучше всего получить доступ ко всеммои переменные из того же пакета и получить код, легко читаемый и изменяемый другими программистами. Есть предложения?