Java 单击子菜单时,打开一个额外窗口

Java 单击子菜单时,打开一个额外窗口,java,swing,jbutton,Java,Swing,Jbutton,我正在努力提高自己的java编程水平 我想做的是,我有一个菜单和子菜单,例如,我点击文件菜单,选择转换器(子菜单),我希望它为我的转换器程序打开一个新窗口 这是我的转换窗口 public class Converter extends JFrame { private static final long serialVersionUID = 1L; private MoneyDetails convertMe = new MoneyD

我正在努力提高自己的java编程水平

我想做的是,我有一个菜单和子菜单,例如,我点击文件菜单,选择转换器(子菜单),我希望它为我的转换器程序打开一个新窗口

这是我的转换窗口

public class Converter extends JFrame {

    private static final long   serialVersionUID    = 1L;
    private MoneyDetails        convertMe           = new MoneyDetails();
    private JLabel              tlLabel             = new JLabel("     Amount of TL");
    private JLabel              dollarsLabel        = new JLabel("Amount of Dollars");
    private JTextField          tlField             = new JTextField("0.0");
    private JTextField          dollarsField        = new JTextField("0.0");
    private JButton             tlButton            = new JButton("Convert to $");
    private JButton             dollarsButton       = new JButton("<<< Convert to TL");
    private JButton             setRates            = new JButton("Set Rates");

    public Converter() {
        JPanel dataPanel = new JPanel(new GridLayout(2, 2, 12, 6));
        dataPanel.add(tlLabel);

        dataPanel.add(dollarsLabel);
        dataPanel.add(tlField);
        dataPanel.add(dollarsField);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(tlButton);
        buttonPanel.add(dollarsButton);
        Container container = getContentPane();
        container.add(dataPanel, BorderLayout.CENTER);
        container.add(buttonPanel, BorderLayout.SOUTH);
        tlButton.addActionListener(new TLConverter());
        dollarsButton.addActionListener(new DollarsConverter());
        buttonPanel.add(setRates);
    }
    private class TLConverter implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            try {
                String input = tlField.getText();
                double tl = Double.parseDouble(input);
                convertMe.setTL(tl);
                double dollars = convertMe.getDollars();
                dollarsField.setText(String.format("%.2f", dollars));
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, "Please enter the amount that will be converted.");
            }
        }
    }

    private class DollarsConverter implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String input = dollarsField.getText();
            double dollars = Double.parseDouble(input);
            convertMe.setDollars(dollars);
            double tl = convertMe.getTL();
            tlField.setText(String.format("%.2f", tl));
        }
    }

    public static void main(String[] args) {
        Converter theGUI = new Converter();
        theGUI.setTitle("TL to $ or $ to TL Converter");
        theGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        theGUI.pack();
        theGUI.setVisible(true);
    }
}

当我点击我的子菜单时,我希望它打开我的转换窗口。我该怎么做呢?

您需要的是一个事件侦听器,类似于:

fileMenu.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent e) {
        new Converter();
      }
    });

您可以看到一个更完整的示例。

您需要将侦听器添加到菜单项中,侦听器在特定事件发生时为您提供回调,如单击、鼠标出e.t.c

您可以向菜单项添加ActionListener,并在回调方法中显示GUI

subTest.addActionListener(new ActionListener(){     
   public void actionPerformed(ActionEvent actionEvent){
       Converter convert = new Converter("Testing Opening this from Menu Item");
       convert.pack();
       convert.setVisible(true);
   }
});

您可以阅读Swing提供的所有不同侦听器。

非常感谢,但我已经尝试了这个侦听器,它编译得非常好,但当我单击我的子菜单时,它不会弹出我的转换器窗口:/Edited my answer,在您的构造函数中,您只是将组件添加到框架中,而不是使其可见。试试这个应该行得通是的,那个行得通。非常感谢:)我所要做的就是为新窗口配置我的转换器窗口。有没有办法直接将我的窗口弹出到名为Testing的新窗口打开此菜单项?很高兴它帮助了您:)我不理解您的问题。我已将其应用于我的子菜单,但它不允许我使用addSelectionListener事件“希望它打开新窗口”请参见
subTest.addActionListener(new ActionListener(){     
   public void actionPerformed(ActionEvent actionEvent){
       Converter convert = new Converter("Testing Opening this from Menu Item");
       convert.pack();
       convert.setVisible(true);
   }
});