如何使一个班级对按下另一个班级的按钮做出反应?

时间:2018-10-11 22:57:07

标签: java swing button

嗨,我是编程的新手,现在就想弄清楚。预先感谢您的帮助。

我正在尝试在一个类中创建一个按钮,当按下该按钮时,另一类可以知道。

这是第一个包含要在其他类中调用的testWindow方法的类。

import javax.swing.*;
import java.awt.event.*;    
public class TestWindow {
    public static void testWindow() {
      JFrame frame = new JFrame("test");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      JLabel text = new JLabel("this is a test!",SwingConstants.CENTER);
      text.setBounds(0,30,300,50);

      JButton button = new JButton("Start");
      button.setBounds(100,100,100,40);

      frame.add(text);
      frame.add(button);
      frame.setSize(300,200);
      frame.setLayout(null);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);

      button.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            //I don't know what to put here
         }
      }); 
   }
}

这是我要使用testWindow方法的第二个类。

public class MainTest extends TestWindow {
   public static void main(String[] arg){
      testWindow();
      //other stuff that happens when "start" is pressed
   } 
}

当我运行MainTest类时,将出现应有的testWindow。但是,当按下“开始”按钮时,我想关闭该框架,然后在main方法中执行其他操作。我将如何处理?

1 个答案:

答案 0 :(得分:3)

  

当我运行MainTest类时,将出现应有的testWindow。但是,当按下“开始”按钮时,我想关闭该框架,然后在main方法中执行其他操作。我该怎么办?

您需要一个 modal 对话框的功能,该对话框可暂停程序流,直到处理完为止。在这种情况下,您不应该使用不允许这种形式的模态的JFrame,而应该使用Swing模态对话框,例如您创建,制作模态和显示的JOptionPane或JDialog。然后,GUI程序流程停止,直到对话框窗口不再可见。

如果执行此操作,则按钮的所有操作侦听器所需要做的就是关闭保存它的对话框窗口。


旁注:您在这里滥用继承,因为MainTest类绝对应该从TestWindow类扩展。尽管在此简单代码中可能无关紧要,但可能会并会在将来的代码中引起问题。


例如

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Dialog.ModalityType;
import java.awt.event.*;

public class TestWindow {
    public static void testWindow() {
        // JFrame frame = new JFrame("test");
        final JDialog frame = new JDialog((JFrame) null, "Test", ModalityType.APPLICATION_MODAL);
        frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel text = new JLabel("this is a test!", SwingConstants.CENTER);
        // text.setBounds(0, 30, 300, 50);

        JButton button = new JButton("Start");
        // button.setBounds(100, 100, 100, 40);

        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                frame.dispose();
            }
        });

        int eb = 15;
        JPanel panel = new JPanel(new BorderLayout(eb, eb));
        panel.setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));
        panel.add(text, BorderLayout.PAGE_START);
        panel.add(button, BorderLayout.CENTER);

        frame.add(panel);
        frame.pack();
        // frame.setSize(300, 200);
        // frame.setLayout(null);

        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

import javax.swing.SwingUtilities;

public class TestTestWindow {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            TestWindow.testWindow();
            System.out.println("Called after test window no longer visible");
        });
    }
}