【问题标题】:Disposing JFrame with addActionListener using a JButton使用 JButton 使用 addActionListener 处理 JFrame
【发布时间】:2013-06-22 16:33:33
【问题描述】:

过去 3 天我一直在尝试解决这个问题:/

我有一个创建 JFrame 对象的类 Login()

另一个名为 LoginTab() 的类有一个以 JFrame 对象为参数的构造函数。

我想在 LoginTab() 类中使用 Button 处理 JFrame。但是 addActionListener 不接受 JFrame 对象,我不知道为什么:(

LoginTab() 的代码:

package tabs;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;

import abstractClasses.JTextFieldImmo;
import abstractClasses.ValidateInput;

import programs.MySQL;
import windows.ButtonPanel;
import windows.UserDetails;

public class LoginTab extends ValidateInput {

/**
 * 
 */
private static final long serialVersionUID = 1L;

static Locale locale = new Locale("de");
static ResourceBundle r = ResourceBundle.getBundle("Strings", locale);

// static Connection con = null;
static Statement stnt = null;
static ResultSet rs = null;

public LoginTab(JFrame window) {
    panelMethod(window);
}

// LOGIN ITEMS
JLabel usernameLbl = new JLabel(r.getString("username"));
JLabel passwordLbl = new JLabel(r.getString("password"));
JTextFieldImmo usernameFld = new JTextFieldImmo(10);
JPasswordField passwordFld = new JPasswordField(10);
JButton loginBtn = new JButton(r.getString("login"));
JButton registerUserBtn = new JButton("Neuer Benutzer"); // TODO String
                                                            // einfügen

public void panelMethod(JFrame window) {

    this.setLayout(new GridBagLayout());

    GridBagConstraints c = new GridBagConstraints();

    // Insets
    c.insets = new Insets(4, 5, 0, 0);

    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 0;
    this.add(usernameLbl, c);

    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1;
    c.gridy = 0;
    this.add(usernameFld, c);

    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 1;
    this.add(passwordLbl, c);

    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1;
    c.gridy = 1;
    this.add(passwordFld, c);

    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 1;
    c.gridy = 2;
    this.add(loginBtn, c);

    c.fill = GridBagConstraints.HORIZONTAL;
    c.gridx = 0;
    c.gridy = 2;
    this.add(registerUserBtn, c);

    // Actions Listener


    loginBtn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                MySQL.connect();
                String username = usernameFld.getText().trim();
                String password = String.valueOf(passwordFld.getPassword())
                        .trim();

                String sql = "SELECT username,password from per_user where username = '"
                        + username + "'and password = '" + password + "'";
                stnt = MySQL.getCon().createStatement();
                rs = stnt.executeQuery(sql);

                int count = 0;

                while (rs.next()) {
                    count = count + 1;
                }

                if (count == 1) {
                    JOptionPane.showMessageDialog(null, "User Found, Access Granded!"); //TODO String
                    //window.setVisible(false);
                    //window.dispose();
                    new ButtonPanel();
                } else if (count > 1) {
                    JOptionPane.showMessageDialog(null,
                            "Duplicate User, Access Denied!"); // TODO String einfügen
                } else {
                    JOptionPane.showMessageDialog(null, "User not Found"); // TODO String einfügen
                }

            } catch (Exception e1) {
                // JOptionPane.showMessageDialog(null,
                // "Es konnte keine Verbindung zum MySQL Server hergestellt werden.");
                e1.printStackTrace();
            }

        }
    });

    registerUserBtn.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            new UserDetails();
        }
    });

    passwordFld.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            loginBtn.doClick();

        }
    });
}
}        

【问题讨论】:

    标签: java swing class jframe dispose


    【解决方案1】:

    查看来自Closing an ApplicationExitAction。 ExitAction 类将找到活动窗口,然后向该窗口发送关闭请求。所以这个类可以用来关闭任何窗口。

    【讨论】:

      【解决方案2】:

      您需要将window 引用为final 以便在匿名类ActionListener 中访问它:

      public void panelMethod(final JFrame window) {
          // obmitted code
      }
      

      然后:

      loginBtn.addActionListener(new ActionListener() {
          // obmitted coce
      
          if (count == 1) {
          JOptionPane.showMessageDialog(null, "User Found, Access Granded!"); //TODO String
          window.setVisible(false);
          window.dispose();
          new ButtonPanel();
          }
      
          // ...
      }
      

      我建议您阅读 Core Java Volumn I,以了解开发 Java 应用程序以及使用 Swing 组件的好方法。

      【讨论】:

        【解决方案3】:

        要调用另一个对象的方法,您需要对该对象的引用。我在您的代码中看到的一个问题是(无论如何我都可以看到)没有对您当前可视化登录对象的引用。要解决这个问题,你需要获得这个引用,可能是通过构造函数参数或setter方法,然后关闭JFrame。

        顺便说一句,在这种时尚的中间程序中必须关闭 JFrame 有点不寻常。您确定不应该在此处使用模态对话框(例如 JDialog)来代替 JFrame 吗?

        此外,您的代码显示了许多 GUI 组件,但它们在哪里添加到顶级窗口并显示?


        编辑
        另请注意,您可以通过 SwingUtilities 方法获得封闭的顶级窗口:

        SwingUtilities.getWindowAncestor(...);
        

        【讨论】:

        • 感谢您的回复。我完全忘记了 Getter 和 Setter 方法。 Login 类有一个 JTabbed 对象,它添加了 LoginTab() 类。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-12
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多