JInternalFrame минимизировать при сохранении текущего местоположения - PullRequest
2 голосов
/ 02 августа 2011

Мне нужна функция значков / минимизации JInternalFrame, чтобы свернуть фрейм (что он делает), но также сохранить положение JInternalFrame в его родительском компоненте. В настоящее время, когда я нажимаю кнопку минимизации JInternalFrame, java размещает компонент в нижней части его контейнера. Есть ли способ сохранить местоположение при минимизации? Если нет очевидного решения, как я могу заметить иконку и удалить прослушиватель по умолчанию? Спасибо.

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Чтобы изменить это поведение, вам нужно создать реализацию javax.swing.DesktopManager. Чтобы получить большую часть стандартного поведения, которое уже доступно, я бы предложил создать подкласс javax.swing.DefaultDesktopManager.

.

В DefaultDesktopManager метод iconifyFrame(JInternalFrame f) контролирует полное поведение, но внутренне использует метод protected Rectangle getBoundsForIconOf(JInternalFrame f), чтобы определить границы для значка минимизируемого кадра. Здесь вы можете вернуть границы для значка внутреннего фрейма, который вы хотите использовать. Проблема в том, что эти значения кэшируются, поэтому, если вы хотите, чтобы они перемещались каждый раз, вам нужно будет выполнить что-то вроде следующего.

import javax.swing.DefaultDesktopManager;
import javax.swing.DesktopManager;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.Dimension;

public class CustomDesktopManager extends DefaultDesktopManager {
    @Override
    public void iconifyFrame(JInternalFrame f) {
        super.iconifyFrame(f);

        JInternalFrame.JDesktopIcon icon = f.getDesktopIcon();
        Dimension prefSize = icon.getPreferredSize();
        icon.setBounds(f.getX(), f.getY(), prefSize.width, prefSize.height);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JDesktopPane desktopPane = new JDesktopPane();
                DesktopManager dm = new CustomDesktopManager();
                desktopPane.setDesktopManager(dm);
                JInternalFrame internalFrame = new JInternalFrame("Test Internal Frame", true, false, true, true);
                internalFrame.setSize(200, 150);
                internalFrame.setVisible(true);
                desktopPane.add(internalFrame);

                frame.add(desktopPane, BorderLayout.CENTER);
                frame.setSize(800, 600);
                frame.setVisible(true);
            }
        });
    }
}
0 голосов
/ 16 декабря 2011

Просто для записи: если вам нужно просто поменять значок Location или Size, другой способ добиться этого - через событие internalFrameIconified () вашего JInternalFrame:

public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
    JInternalFrame.JDesktopIcon icon = myInternalFrame.getDesktopIcon();
    icon.setSize(new Dimension(200,icon.getSize().height)); //Change icon width to 200
    icon.setLocation(x,y); //You can calculate its position as you wish (not implemented here).    
}

Таким образом, выможет устанавливать правила независимо для каждого JInternalFrame (или типа JInternalFrame) без необходимости расширять DefaultDesktopManager.Тем не менее, я настоятельно рекомендую следовать рекомендации Джошуа, если вы хотите, чтобы в целом влияли на все JInternalFrames.

...