java - 如何将容器内的内部框架图标化到特定位置

标签 java swing jinternalframe

我想将我的内部框架图标化到主框架的相邻面板,而不是主框架的默认左下角。

我正在使用 jdesktopframe 及其内部框架。

/image/S5xi5.jpg

我想图标化连接细节,它是一个内部框架,图标化的图标应该出现在最小化按钮所在的位置,而不应该出现在主框架的左下角。

这是示例代码:

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
import javax.swing.plaf.basic.BasicInternalFrameUI;


public class MinPanel {

    public MinPanel() throws HeadlessException, PropertyVetoException {
        createAndShowGUI();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new MinPanel();
                } catch (HeadlessException ex) {
                } catch (PropertyVetoException ex) {
                }

            }
        });
    }

    private void createAndShowGUI() throws HeadlessException, PropertyVetoException {
        JFrame frame = new JFrame();
        frame.setResizable(true);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        final JDesktopPane jdp = new JDesktopPane() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 200);
            }
        };

        frame.setContentPane(jdp);
        frame.pack();

        createAndAddInternalFrame(jdp, 0, 0);
        createAndAddfixedpanel(jdp,200,0);

        frame.setVisible(true);
    }

    private void createAndAddInternalFrame(final JDesktopPane jdp, int x, int y) throws PropertyVetoException {
        final JInternalFrame jInternalFrame = new JInternalFrame("Test1", false, false, false, false);
        jInternalFrame.setLocation(x, y);

        jInternalFrame.setLayout(new GridLayout(2, 2));
        jInternalFrame.setSize(200, 200);//testing
        JButton jb = new JButton("min");
        jInternalFrame.add(jb);
        jb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                try {
                    jInternalFrame.setIcon(true);
                } catch (PropertyVetoException ex) {
                }

            }
        });
       BasicInternalFrameTitlePane titlePane = (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) jInternalFrame.getUI()).getNorthPane();
      jInternalFrame.remove(titlePane);


        jInternalFrame.setVisible(true);
        jdp.add(jInternalFrame);
    }
     private void createAndAddfixedpanel(final JDesktopPane jdp, int x, int y)
     { JPanel panel = new JPanel();
      panel.setLocation(x, y);
        panel.setLayout(new FlowLayout());  
         panel.setSize(200, 200);
        JLabel label = new JLabel("JFrame By Example");  
        JButton button = new JButton();  
        button.setText("Button");  
        panel.add(label);  
        panel.add(button);  

         panel.setVisible(true);
     jdp.add(panel);  

     }
}

我还想在内部框架最小化和最大化时调整主框架的大小

最佳答案

诀窍是您不要对 JInternalFrame 对象执行 setLocation()setBounds() 操作。这将移动 Pane ,当您“图标化”内部框架时,该 Pane 将不再可见。但是,您可以更改图标,当您“图标化”内部框架时,该图标现在可见。要获取图标,请使用 getDesktopIcon() JInternalFrame 类上的方法。之后,只需对收到的 JInternalFrame.JDesktopIcon 对象进行 setLocation() 调用即可。您可以像这样使用它:

frame.addInternalFrameListener(new InternalFrameAdapter() {
    @Override
    public void internalFrameIconified(InternalFrameEvent e) {
        frame.getDesktopIcon().setLocation(frame.getLocation().x, frame.getLocation().y);
    }
});

显然,您必须自己计算要放置图标的正确位置。此示例仅显示如何将图标移动到正确的位置,这样它就不会在左下角打开。

您可能需要为相反的 internalFrameDeiconified 事件添加类似的事件处理程序,以打开图标所在的原始 JInternalFrame 面板,而不是面板之前所在的位置“图标化”。

关于java - 如何将容器内的内部框架图标化到特定位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56303399/

相关文章:

java - JInternalFrames 监听 JDesktopPane 事件

java - DOCX4J:在 JEditorPane 中查看 HTML 导出的文档文件

java - 我可以使用 Maven 插件更新文件内容吗?

Java TCP/IP 套接字性能问题

java - 4 个线程添加到一个 jlist

Java:如何将.gif设置为与框架相同的大小

带有 SSL 的 Java JMX 客户端

java - Springfox - 手动,以编程方式添加模型

Java Swing 组件交互(BoxLayout 和 Label)

java - 只允许一个 JInternalFrame 实例