Java 如何从同一个包访问多个类变量?
我一直在尝试编写一个GUI来测试JDBC连接,该连接使用JComboBox来选择MySQL或PostgreSQL之类的驱动器。还有多个JTextFields可以插入主机、端口、数据库、用户名等,所以我可以在未来的项目中使用它 我有一个用于GUI部分的类和其他用于操作的类,但是测试连接的按钮需要访问Java 如何从同一个包访问多个类变量?,java,class,package,Java,Class,Package,我一直在尝试编写一个GUI来测试JDBC连接,该连接使用JComboBox来选择MySQL或PostgreSQL之类的驱动器。还有多个JTextFields可以插入主机、端口、数据库、用户名等,所以我可以在未来的项目中使用它 我有一个用于GUI部分的类和其他用于操作的类,但是测试连接的按钮需要访问JComboBox和所有JTextField来尝试连接。 我把protectedstatic作为我的变量,这样我就可以从主gui类访问,但我认为这是一个坏主意,我希望我的代码在将来同样易于阅读和重写
JComboBox
和所有JTextField
来尝试连接。
我把protectedstatic
作为我的变量,这样我就可以从主gui类访问,但我认为这是一个坏主意,我希望我的代码在将来同样易于阅读和重写
这是主要的GUI类
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);
}
}
因此,正如我之前所说,我想知道从同一个包中访问所有变量的最佳方法,并使代码易于其他程序员阅读和修改。有什么建议吗?可能,但我认为这是个坏主意。。。我也同意。它违反了“关注点分离”。DatabaseTestConnection不应该知道是谁调用它,不管它是GUI还是其他什么。DatabaseTestConnection的工作是测试数据库连接,而不是执行gui操作。例如,一个选项是调用方提供一个包含所有参数的对象(不是J-where字段,只是值)以及一个结果成员,DatabaseTestConnection可以设置该成员以指示成功/失败。这就是我要说的。提供价值观的好主意。我试试看。
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]);
}
}