Skip to main content
 首页 » 编程设计

java之从模态 JDialog 打开时激活 JFrame

2024年02月27日44mfryf

我需要从父 JFrame 启动一个 JDialog 并进入模态。从 JDialog 我需要查看另一个 JFrame(子框架)并访问它。但是一旦我们打开了模态对话框,我们就无法访问,所以是否有任何解决方法来访问从模态对话框打开的子框架。

这是代码片段。我需要访问从 j 模态对话框打开的 f1 框架。

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);                 
            } 
 
        });      
    } 
} 

请您参考如下方法:

如果您有框架 f1 和 f2,并且对话框 d 是 f1 的父级,d 是 f2 的父级,您可以将 f2 设为对话框而不是框架吗?这将给出框架 f 和对话框 d1 和 d2,f 为 d1 的父级为 d2 的父级。

否则,您似乎在尝试使用与预期相反的 Swing 工具,因此重新审视设计似乎比试图将方钉强行插入圆孔更好。