Прослушивание событий в другом компоненте и ожидание ответа - PullRequest
1 голос
/ 15 апреля 2019

Я хочу добавить JPanel в мой GUI, который будет иметь несколько кнопок, скажем, b1, b2, b3. Эта JPanel будет добавлена ​​динамически, пока приложение уже запущено, нажатием кнопки, скажем, b. Когда я отображаю JPanel, кнопка b не будет работать, пока не будет нажата одна из кнопок b1, b2, b3.

Я создал класс JPanel, который содержит кнопки b1, b2, b3, и добавил обработчики событий, а внутри обработчика событий мыши для кнопки b я создал объект jPanel. Итак, JPanel отображается, но кнопка b не ожидает ответа от b1, b2 & b3.

Остальной код события кнопки b будет зависеть от того, какой выбор сделан между b1, b2 и b3. Таким образом, эта строка кода будет приостановлена, пока не будет сделан выбор.

Как я могу остановить кнопку b, пока не будет выбрана одна из кнопок?

Вот MCVE ...

1) Главный класс ...

package com.company;

import javax.swing.*;

public class Main {

    public static void main(String[] args) {
        JFrame frame = new Frame();
        frame.setVisible(true);
    }
}

2) Класс каркаса ...

import java.awt.event.MouseEvent;

public class Frame extends JFrame {
    public Frame() {
        super.setLayout(new FlowLayout());
        JButton b = new JButton("Click Me!!");
        b.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                Panel panel = new Panel();
                Frame.super.add(panel);

                // After this I have more handling code, which depends on which button was chosen.
                // But I cant stop the execution at this point and make it wait for a choice.

                Frame.super.revalidate();
            }
        });
        super.add(b);
        super.validate();
    }
}

3) Класс панели ...

package com.company;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Panel extends JPanel {
    public Panel() {
        super.setLayout(new FlowLayout());
        super.setBackground(Color.BLACK);

        MouseAdapter listener = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                JButton button = (JButton) e.getSource();
                // return button ??
                // return the name of the button to the event handler of the button b in the JFrame for further execution.
            }
        };

        JButton b1 = new JButton("option 1");
        b1.addMouseListener(listener);
        JButton b2 = new JButton("option 2");
        b2.addMouseListener(listener);
        JButton b3 = new JButton("option 3");
        b3.addMouseListener(listener);

        super.add(b1);
        super.add(b2);
        super.add(b3);
    }
}

Части, в которые я хочу добавить некоторый код, комментируются, и объясняется функциональность, которую я хочу добавить.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Вот рабочий пример отображения диалогового окна поверх JFrame и отключения JFrame до закрытия диалогового окна, а затем обработки нажатий в диалоговом окне при закрытии диалогового окна.

package javaapplication4;

import java.awt.FlowLayout;
import java.awt.Window;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class Frame extends JFrame implements FocusListener {

    Window window;
    JFrame jFrame;
    JDialog jDialog;
    String whichButton;

    public Frame() {
        this.jDialog = initDialog();
        this.jFrame = initFrame();
    }

    private JFrame initFrame() {

        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 500);

        JButton b = new JButton("Click Me!!");
        b.requestFocusInWindow();
        b.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Button b clicked");
                setWhichButton("");
                getjFrame().setEnabled(false);
                getjDialog().setVisible(true);
                getjDialog().requestFocusInWindow();
                // the FocusListener will handle input from dialog
            }
        });
        add(b);

        try {
            JDialog jd = getjDialog();
            add(jd);
        } catch (Exception ex) {
            // swallow for now
        }

        setWindow(this);

        return this;

    }

    @Override
    public void focusGained(FocusEvent e) {
        String selectedButton = getWhichButton();
        switch (selectedButton) {
            case "b1":
                System.out.println("Button b1 was clicked");
                break;
            case "b2":
                System.out.println("Button b2 was clicked");
                break;
            case "b3":
                System.out.println("Button b3 was clicked");
                break;
            default:
        }
    }

    @Override
    public void focusLost(FocusEvent e) {
    }

// The Panel to add dynamically

    private JDialog initDialog() {
        JDialog jd = new JDialog();
        setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
        jd.setLayout(new FlowLayout());
        jd.setFocusable(true);
        jd.setSize(300, 300);
        jd.setVisible(false);
        jd.setLocation(100, 50);
        JButton b1 = new JButton("option 1");
        b1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Button b1 clicked");
                setWhichButton("b1");
                getjDialog().setVisible(false);
                getjFrame().setEnabled(true);
                getjFrame().requestFocusInWindow();
            }
        });

        JButton b2 = new JButton("option 2");
        b2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Button b2 clicked");
                setWhichButton("b2");
                getjDialog().setVisible(false);
                getjFrame().setEnabled(true);
                getjFrame().requestFocusInWindow();
            }
        });

        JButton b3 = new JButton("option 3");
        b3.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("Button b3 clicked");
                setWhichButton("b3");
                getjDialog().setVisible(false);
                getjFrame().setEnabled(true);
                getjFrame().requestFocusInWindow();
            }
        });

        jd.add(b1);
        jd.add(b2);
        jd.add(b3);

        jd.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                getjFrame().setEnabled(true);
            }
        });
        return jd;
    }

    public Window getWindow() {
        return window;
    }

    private void setWindow(Window window) {
        this.window = window;
    }

    public JDialog getjDialog() {
        return jDialog;
    }

    public void setjDialog(JDialog jDialog) {
        this.jDialog = jDialog;
    }

    public JFrame getjFrame() {
        return jFrame;
    }

    public void setjFrame(JFrame jFrame) {
        this.jFrame = jFrame;
    }

    public String getWhichButton() {
        return whichButton;
    }

    public void setWhichButton(String whichButton) {
        this.whichButton = whichButton;
    }

    public static void main(String[] args) {
        Frame frame = new Frame();
        frame.setVisible(true);
    }

}
0 голосов
/ 15 апреля 2019

Вы можете вызвать функцию-член .setDisabled (), чтобы отключить b, а затем использовать .setEnabled (), чтобы включить его. Вы можете легко отключить b при нажатии и включить его с помощью прослушивателя действий при нажатии b1, b2 или b3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...