java JDesktopPane未显示任何组件

nlejzf6q  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(126)

我正在试验桌面窗格,以便可以在工作项目中使用它们。这里的问题是,我想在JDesktopPane中使用JInternalFrame,在普通JPanel中它可以正常显示,但不能移动它,使用桌面窗格不会显示任何添加的组件。
下面是最后一次尝试的代码,只是为了学习它是如何工作的简单:

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

public class Internal_FrameShowtst extends JFrame{

    Internal_FrameShowtst(){
        BorderLayout bl = new BorderLayout();
        JDesktopPane p = new JDesktopPane();
        JPanel p1 = new JPanel();
        JButton b = new JButton("click");
        JInternalFrame in = new JInternalFrame("Test");
        Internal_Frametst ift = new Internal_Frametst();
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                //p1.add(new JLabel("hola"));
                //in.add(p1);
                //in.setVisible(true);
                ift.setVisible(true);
            }
        });
        p1.add(b);
        bl.addLayoutComponent(p,BorderLayout.CENTER);
        //p.add(in);
        p.add(ift);
        p.repaint();
        setLayout(bl);
        add(p);
    }

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

自定义内部框架类:

import javax.swing.*;

public class Internal_Frametst extends JInternalFrame {

    Internal_Frametst(){
        JPanel p = new JPanel();
        JLabel label = new JLabel("Halo");
        setIconifiable(true);
        //setIcon(true);
        setClosable(true);
        p.add(label);
        p.setSize(300,300);
        add(p);
        //setVisible(true);
    }
}

我已经阅读并尝试了以下方法:Components inside JDesktopPane not showingJDesktopPane not displaying components when adding JInternalFrame
我尝试过直接添加组件、添加JPanel、添加内部框架、尝试不添加内部框架、在主类中创建内部框架、在其自己的类中创建自己的内部框架、对两个面板(普通面板和桌面面板)使用布局管理器,所有这些都得到了相同的结果。

5lhxktic

5lhxktic1#

你的代码创建了几个组件,但这些组件从未添加到可见UI中。在你发布的版本中,内部框架是不可见的,使其可见的按钮也不是框架的一部分。但组件的初始大小也有问题。
我强烈建议在源代码中将组件的创建、初始属性的设置以及将组件添加到父组件的代码放在一起。
此外,请考虑Prefer composition over inheritance?中讨论的要点,您的子类是完全不必要的。
下面是代码的修订版本,单击按钮时将打开内部框架:

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.*;

public class UiExample {
    public static void main(String[] args) {
        EventQueue.invokeLater(UiExample::initializeUI);
    }

    static void initializeUI() {
        JPanel p1 = new JPanel();
        JButton b = new JButton("Show Internal Frame");
        p1.add(b);

        JInternalFrame ift = initializeInternalFrame();
        b.addActionListener(e -> {
            ift.pack();
            ift.setVisible(true);
        });
        JDesktopPane p = new JDesktopPane();
        p.add(ift);

        JFrame mainFrame = new JFrame();
        mainFrame.setSize(300, 200);
        mainFrame.getContentPane().add(p, BorderLayout.CENTER);
        mainFrame.getContentPane().add(p1, BorderLayout.PAGE_START);
        mainFrame.setVisible(true);
    }

    static JInternalFrame initializeInternalFrame() {
        JInternalFrame iFrame = new JInternalFrame();
        iFrame.setIconifiable(true);
        // setIcon(true);
        iFrame.setClosable(true);
        iFrame.setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE);
        JPanel p = new JPanel();
        p.add(new JLabel("Hello"));
        iFrame.add(p);
        return iFrame;
    }
}

请注意,setDefaultCloseOperation(JInternalFrame.HIDE_ON_CLOSE)对于能够在内部框架关闭后通过setVisible(true)再次显示框架是必需的。

相关问题