Как заставить один класс реагировать на нажатие кнопки в другом? - PullRequest
0 голосов
/ 12 октября 2018

Привет, я новичок в программировании и пытаюсь разобраться во всем.Заранее спасибо за помощь.

Я пытаюсь сделать кнопку в одном классе, чтобы при нажатии другой класс знал.

Вот первый класс, который содержит метод 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 появляется так, как должно.Но когда нажата кнопка «Пуск», я хочу закрыть этот кадр, а затем выполнить другие действия в основном методе.Как бы я пошел об этом?

1 Ответ

0 голосов
/ 12 октября 2018

Когда я запускаю класс MainTest, testWindow появляется так, как должно.Но когда нажата кнопка «Пуск», я хочу закрыть этот кадр, а затем выполнить другие действия в основном методе.Как бы я поступил об этом?

Вы хотите функциональность модального диалогового окна, окна, которое останавливает выполнение программы до тех пор, пока с ним не будут обработаны.И в этой ситуации вы не должны использовать 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");
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...