繁体   English   中英

如何使我的按钮在BoxLayout中执行某些操作?

[英]How to make my button do something in a BoxLayout?

我制作了一个BoxLayout GUI,我想知道如何使用动作侦听器来使按钮关闭窗口。 如果我尝试放入RegisterNew.setVisible(false); 在一个动作监听器中,它给我一个错误

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RegisterNew extends JFrame
{
public RegisterNew(int axis){
    // creates the JFrame
    super("BoxLayout Demo");

    Container con = getContentPane();

    con.setLayout(new BoxLayout(con, axis));

    con.add(new JLabel("Enter your desired username"));
    con.add(new JTextField());
    con.add(new JLabel("Enter your password"));
    con.add(new JTextField());
    con.add(new JButton("Create Account"));

    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    pack();

    setVisible(true);
}

public static void main(String args[])
{
    RegisterNew newDemo = new RegisterNew(BoxLayout.Y_AXIS);
}

}

我也试图将其链接到另一个GUI,以便当您按下一个按钮时出现此按钮,但是它给了我与我将RegisterNew.setVisible(true);相同的错误。 进入动作监听器

  1. 如果那是从属对话框窗口,则使用JDialog,而不是JFrame。
  2. 如果您的ActionListener是一个内部类,则使用RegisterNew.this.close();
  3. 否则,您可以使用SwingUtilities.getWindowAncestor(button)并为返回的Window调用close()或更好的dispose()来获取JButton的窗口祖先。
  4. 请注意,BoxLayout和布局管理器通常与您当前的问题无关。

例如,

测试类,它显示新的注册对话框并从中提取信息。

import java.awt.BorderLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class TestRegistration extends JPanel {
    private JTextArea textArea = new JTextArea(30, 60);

    public TestRegistration() {
        JPanel bottomPanel = new JPanel();
        bottomPanel.add(new JButton(new ShowRegisterNewAction()));
        textArea.setFocusable(false);
        textArea.setEditable(false);

        setLayout(new BorderLayout());
        add(new JScrollPane(textArea, 
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
        add(bottomPanel, BorderLayout.PAGE_END);
    }

    private class ShowRegisterNewAction extends AbstractAction {
        private RegisterNew registerNew = null;

        public ShowRegisterNewAction() {
            super("Show Register New Dialog");
            putValue(MNEMONIC_KEY, KeyEvent.VK_S);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if (registerNew == null) {
                JButton btn = (JButton) e.getSource();
                Window window = SwingUtilities.getWindowAncestor(btn);
                registerNew = new RegisterNew(window, BoxLayout.PAGE_AXIS);
            }
            registerNew.setVisible(true);
            String userName = registerNew.getUserName();
            String password = new String(registerNew.getPassword());

            textArea.append("User Name: " + userName + "\n");
            textArea.append("Password: " + password + "\n");
            textArea.append("\n");
        }
    }

    private static void createAndShowGui() {
        JFrame frame = new JFrame("TestRegistration");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new TestRegistration());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

新的Register类保存该对话框,并具有用于显示该对话框和从中提取信息的代码。 使用BoxLayout。

import java.awt.Container;
import java.awt.Window;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class RegisterNew {
    private JDialog dialog = null;
    private JTextField nameField = new JTextField(10);
    private JPasswordField passField = new JPasswordField(10);

    public RegisterNew(Window window, int axis) {
        dialog = new JDialog(window, "Register New", ModalityType.APPLICATION_MODAL);
        Container con = dialog.getContentPane();

        con.setLayout(new BoxLayout(con, axis));

        con.add(new JLabel("Enter your desired username"));
        con.add(nameField);
        con.add(new JLabel("Enter your password"));
        con.add(passField);
        con.add(new JButton(new AcceptAction()));
        dialog.pack();
        dialog.setLocationRelativeTo(window);

    }
    public char[] getPassword() {
        return passField.getPassword();
    }
    public String getUserName() {
        return nameField.getText();
    }
    public void setVisible(boolean b) {
        dialog.setVisible(b);
    }

    private class AcceptAction extends AbstractAction {
        public AcceptAction() {
            super("Accept");
            putValue(MNEMONIC_KEY, KeyEvent.VK_A);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            dialog.dispose();
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM