показывать два диалога друг над другом, используя java swing - PullRequest
1 голос
/ 23 января 2012

У меня есть ситуация, когда я показываю диалог, в котором пользователь должен заполнить некоторые меню, а затем нажать ОК. Это работает нормально, но теперь у меня есть другая кнопка в этом диалоговом окне, которая, если пользователь хочет добавить какое-то определенное значение, я хочу, чтобы всплыло другое диалоговое окно, где пользователь заполняет дополнительное значение, и, нажимая кнопку ОК, это диалоговое окно исчезает, и пользователь возвращается к главному диалог.

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

Есть ли уместный пример или как правильно делать такие вещи?

РЕДАКТИРОВАТЬ:

public static class EdgeMenu extends JPopupMenu {
        // private JFrame frame; 
        public MyMenu(final JFrame frame) {
            super("My Menu");
            // this.frame = frame;

            this.addSeparator();
            this.add(new EdgePropItem(frame));           
        }  
    }  



 //this shows the first dialog, another class because i have some other  
 //functions to be performed here  

    public static class EdgePropItem extends JMenuItem{
            //...       

            public  EdgePropItem(final JFrame frame) {  
                super("Edit Properties");
                this.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        EdgePropertyDialog dialog = new EdgePropertyDialog(frame, edge);
                        dialog.setVisible(true);
                    }

                });
            }

        }  

и теперь в другом диалоге, в кнопке даже слушатель я пытаюсь вызвать другой диалог:

 private void newDialogHandler(java.awt.event.ActionEvent evt) {
        MyNewDialog rdialog = new MyNewDialog(edge);
        rdialog.setVisible(true);
    }  

Выглядит нормально, но предыдущее диалоговое окно не покидает фокус, и оно исчезает, только если я нажимаю «Готово / Готово» в этом диалоговом окне, то, что я хочу, это чтобы новое диалоговое окно было в фокусе, при этом нажимая «ОК» здесь , фокус должен вернуться к старому главному диалогу, но он не работает?

Ответы [ 3 ]

4 голосов
/ 24 января 2012

возможно, этот код может быть демонтировать ваши проблемы,

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

public class SuperConstructor extends JFrame {

    private static final long serialVersionUID = 1L;

    public SuperConstructor() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 300));
        setTitle("Super constructor");
        Container cp = getContentPane();
        JButton b = new JButton("Show dialog");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                FirstDialog firstDialog = new FirstDialog(SuperConstructor.this);
            }
        });
        cp.add(b, BorderLayout.SOUTH);
        JButton bClose = new JButton("Close");
        bClose.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                System.exit(0);
            }
        });
        add(bClose, BorderLayout.NORTH);
        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                SuperConstructor superConstructor = new SuperConstructor();
            }
        });
    }

    private class FirstDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        FirstDialog(final Frame parent) {
            super(parent, "FirstDialog");
            setPreferredSize(new Dimension(200, 200));
            setLocationRelativeTo(parent);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
            JButton bNext = new JButton("Show next dialog");
            bNext.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    SecondDialog secondDialog = new SecondDialog(parent, false);
                }
            });
            add(bNext, BorderLayout.NORTH);
            JButton bClose = new JButton("Close");
            bClose.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            add(bClose, BorderLayout.SOUTH);
            pack();
            setVisible(true);
        }
    }
    private int i;

    private class SecondDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        SecondDialog(final Frame parent, boolean modal) {
            //super(parent); // < --- Makes this dialog 
            //unfocusable as long as FirstDialog is visible
            setPreferredSize(new Dimension(200, 200));
            setLocation(300, 50);
            setModal(modal);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setTitle("SecondDialog " + (i++));
            JButton bClose = new JButton("Close");
            bClose.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            add(bClose, BorderLayout.SOUTH);
            pack();
            setVisible(true);
        }
    }
}
2 голосов
/ 23 января 2012

Вы можете достичь этого следующим образом:

enter image description here

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JOptionPane;

public class MultipleDialogs
{   
    public MultipleDialogs()
    {
        JButton btnOpen = new JButton("Open another dialog!");
        btnOpen.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                JOptionPane.showMessageDialog(null, "This is the second dialog!");
            }
        });
        Object[] options = {"OK", "Cancel", btnOpen};
        int selectedOption = JOptionPane.showOptionDialog(null,
                "This is the first dialog!", "The title",
                JOptionPane.NO_OPTION, JOptionPane.PLAIN_MESSAGE,
                null, options, options[0]);

        if(selectedOption == 0) // Clicking "OK"
        {

        }
        else if(selectedOption == 1) // Clicking "Cancel"
        {

        }
    }

   public static void main(String[] args)
   {
      SwingUtilities.invokeLater(new Runnable()
      {
          @Override
          public void run()
          {
              new MultipleDialogs();    
          });
       }
    }
}

Вы можете заменить "This is the first dialog!" и "This is the second dialog!" на JPanel, которые могут содержать любые компоненты качания, которые вы хотите.

0 голосов
/ 27 января 2018

Создайте второй диалог из конструктора, который принимает диалог и логическое значение в качестве параметров и который решает проблему.

...