Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从同一个包访问多个类变量?_Java_Class_Package - Fatal编程技术网

Java 如何从同一个包访问多个类变量?

Java 如何从同一个包访问多个类变量?,java,class,package,Java,Class,Package,我一直在尝试编写一个GUI来测试JDBC连接,该连接使用JComboBox来选择MySQL或PostgreSQL之类的驱动器。还有多个JTextFields可以插入主机、端口、数据库、用户名等,所以我可以在未来的项目中使用它 我有一个用于GUI部分的类和其他用于操作的类,但是测试连接的按钮需要访问JComboBox和所有JTextField来尝试连接。 我把protectedstatic作为我的变量,这样我就可以从主gui类访问,但我认为这是一个坏主意,我希望我的代码在将来同样易于阅读和重写

我一直在尝试编写一个GUI来测试JDBC连接,该连接使用JComboBox来选择MySQL或PostgreSQL之类的驱动器。还有多个JTextFields可以插入主机、端口、数据库、用户名等,所以我可以在未来的项目中使用它

我有一个用于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]);
    }
}