активировать JFrame при открытии из модального JDialog - PullRequest
1 голос
/ 23 июня 2011

Мне нужно запустить JDialog из родительского JFrame и сделать модальным.из JDialog мне нужно просмотреть другой JFrame (подкадр) и получить к нему доступ.но как только у нас открыто модальное диалоговое окно, мы не можем получить к нему доступ, поэтому есть ли обходной путь для доступа к подкадру, открытому из модального диалогового окна.

Вот фрагмент кода.Мне нужно получить доступ к кадру f1, открытому из модального диалогового окна j.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class TestDialog {

    public static void main(String[] args) {

        TestDialog t=new TestDialog();
        t.show();

    }

    void show(){
        JFrame f = new JFrame("Simple Frame");
        JTextField tf = new JTextField("Text");
        tf.setPreferredSize(new Dimension(200, 100));
        JButton b=new JButton("click me");

        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane() .add(tf, BorderLayout.NORTH);
        f.getContentPane() .add(b, BorderLayout.CENTER);
        f.setBounds(500, 400, 500, 500);
        f.setVisible(true);
        f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);

        final JDialog j=new JDialog();
        j.setSize(200,300);
        JPanel p=new JPanel();
        JButton b1=new JButton("check me");
        p.add(new JLabel("label me"));
        p.add(b1);
        j.getContentPane().add(p);
        j.setDefaultCloseOperation(j.DISPOSE_ON_CLOSE);
        j.setModal(true);
        j.setLocationRelativeTo(f);

        b.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                j.show(true);               
            }

        });     

        final JFrame f1 = new JFrame("Sub Frame");
        f1.getContentPane().setLayout(new BorderLayout());
        f1.getContentPane() .add(new JLabel("label me"), BorderLayout.NORTH);       
        f1.setBounds(600, 500, 300, 300);       
        f1.setDefaultCloseOperation(f1.DISPOSE_ON_CLOSE);

        b1.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                f1.setVisible(true);                
            }

        });     
    }
}

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Если у вас есть фреймы f1 и f2 и диалоговое окно d, где f1 является родительским для d, является родительским для f2, можете ли вы просто сделать f2 диалогом вместо фрейма?Это дало бы кадр f и диалоги d1 и d2, f родительский для d1 родительский для d2.

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

1 голос
/ 23 июня 2011

Другой вариант - воссоздать j (вы модальный дилаог) как немодальное диалоговое окно и показать его после нажатия. Но вы рискуете, что пользователь потеряет диалог где-то между вашими 2 кадрами.

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

Stéphane

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