最小化Jinternal框架而不单击按钮

时间:2012-02-23 14:14:22

标签: java swing jinternalframe

有没有办法在不点击jinternalframe右上角的最小化/最大化按钮的情况下最小化/最大化JinternalFrame?

我遵循了这个帖子programmatically minimize a JInternalFrame?,专门设置了

jinterframe.setIcon(false)

但我没有工作。

感谢。

2 个答案:

答案 0 :(得分:3)

按照我的预期工作,你必须检查JInternalFrame#isIconifiable()(eeerght这个Veto真的是****)

enter image description here

import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyVetoException;
import javax.swing.*;
import javax.swing.plaf.basic.*;

public class InternalFrameUnMovable extends JFrame {

    private static final long serialVersionUID = 1L;
    public JDesktopPane desktop;

    public InternalFrameUnMovable() {
        desktop = new JDesktopPane();
        getContentPane().add(desktop);
        desktop.add(createInternalFrame(1, Color.RED));
        desktop.add(createInternalFrame(2, Color.GREEN));
        desktop.add(createInternalFrame(3, Color.BLUE));
    }

    private JInternalFrame createInternalFrame(int number, Color background) {
        JInternalFrame internal = new JInternalFrame("Frame" + number, true, true, true, true);
        internal.setBackground(background);
        internal.setVisible(true);
        int location = 50 * number;
        internal.setBounds(location, location, 300, 300);
        return internal;
    }

    public static void main(String args[]) throws PropertyVetoException {
        InternalFrameUnMovable frame = new InternalFrameUnMovable();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(600, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        try {// Activate first internal frame
            JInternalFrame[] frames = frame.desktop.getAllFrames();
            frames[0].setSelected(true);
        } catch (java.beans.PropertyVetoException e) {
        }
        JInternalFrame[] frames = frame.desktop.getAllFrames();// Make first internal frame unmovable
        for (int i = 0; i < frames.length; i++) {
            JInternalFrame f = frames[i];
            if (f.isIconifiable()) {
                f.setIcon(true);
            }
        }
        /*JInternalFrame f = frames[0];
        BasicInternalFrameUI ui = (BasicInternalFrameUI) f.getUI();
        Component north = ui.getNorthPane();
        //MouseMotionListener[] actions = (MouseMotionListener[]) north.getListeners(MouseMotionListener.class);
        MouseMotionListener[] actions = north.getListeners(MouseMotionListener.class);
        for (int i = 0; i < actions.length; i++) {
        north.removeMouseMotionListener(actions[i]);
        }*/
    }
}

答案 1 :(得分:2)

方法getAllFrames()“返回图标化的帧以及扩展的帧。”在Mac OS X上,可以忽略图标化的帧。下面的示例演示了异常,并使用List<JInternalFrame>进行补偿。

Normal iconified

import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

/**
 * @see http://stackoverflow.com/q/9414728/230513
 * @see http://stackoverflow.com/a/9415197/230513
 */
public class InternalFrameCount extends JFrame {

    private static final int SIZE = 300;
    private static final String ICONIFY = "Iconify";
    private static final String RESTORE = "Restore";
    private static final String COUNT = "Count:";
    private JDesktopPane desktop = new JDesktopPane();
    private JLabel count = new JLabel(COUNT);
    private List<JInternalFrame> list = new ArrayList<JInternalFrame>();

    public InternalFrameCount() {
        desktop.add(createInternalFrame(1, Color.RED));
        desktop.add(createInternalFrame(2, Color.GREEN));
        desktop.add(createInternalFrame(3, Color.BLUE));
        this.add(desktop);
        JPanel panel = new JPanel();
        panel.add(new JButton(new ButtonAction(ICONIFY)));
        panel.add(new JButton(new ButtonAction(RESTORE)));
        panel.add(count);
        this.add(panel, BorderLayout.SOUTH);
        count.setText(COUNT + desktop.getAllFrames().length);
    }

    private class ButtonAction extends AbstractAction {

        private boolean iconify;

        public ButtonAction(String name) {
            super(name);
            iconify = ICONIFY.equals(name);
        }

        @Override
        public void actionPerformed(ActionEvent ae) {
            for (JInternalFrame jif : list) {
                try {
                    jif.setIcon(iconify);
                } catch (PropertyVetoException e) {
                    e.printStackTrace(System.err);
                }
            }
            count.setText(COUNT + desktop.getAllFrames().length);
        }
    }

    private JInternalFrame createInternalFrame(int number, Color background) {
        JInternalFrame jif = new JInternalFrame(
            "F" + number, true, true, true, true);
        list.add(jif);
        jif.setBackground(background);
        int topLeft = SIZE / 10 * number;
        jif.pack();
        jif.setBounds(topLeft, topLeft, SIZE / 2, SIZE / 2);
        jif.setVisible(true);
        return jif;
    }

    public static void main(String args[]) throws PropertyVetoException {
        System.out.println(System.getProperty("os.name"));
        System.out.println(System.getProperty("java.runtime.version"));
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                InternalFrameCount frame = new InternalFrameCount();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.pack();
                frame.setSize(SIZE, SIZE);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}