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

时间:2019-05-25 09:11:15

标签: java swing jinternalframe

我想将我的内部框架图标化为比主框架的默认左下角更靠近主框架的面板。

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

https://i.stack.imgur.com/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);  

     }
}

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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