Сделать JInternal Frame неподвижным - PullRequest
0 голосов
/ 24 мая 2018

Я делаю заявление в java swing для практики с использованием компонентов перетаскивания, я столкнулся с проблемой, я вставил внутрь JPanel, JInternal Frame

, это подвижно ,

я хочу сделать это неподвижно

, какое событие используется для него?Как мне это сделать ?Я ищу в Интернете, но, к сожалению, не могу найти решение для этого.

Я нашел это в Интернете, но я хочу сделать это с помощью опции события в разгаре.

     // Make first internal frame unmovable

JInternalFrame[] frames = frame.desktop.getAllFrames();
JInternalFrame f = frames[0];
BasicInternalFrameUI ui = (BasicInternalFrameUI)f.getUI();

Component north = ui.getNorthPane();
MouseMotionListener[] actions =        // there is no option for MouseMotionListener in the event option
(MouseMotionListener[])north.getListeners(MouseMotionListener.class);

for (int i = 0; i < actions.length; i++)
north.removeMouseMotionListener( actions[i] );

1 Ответ

0 голосов
/ 24 мая 2018

DesktopManager ответственен за всю работу с внутренними кадрами.Таким образом, вы можете переопределить его, используя шаблон прокси , чтобы сделать некоторые ваши кадры неподвижными.Вот неполный пример для вас (извините, я не тестировал этот код, поэтому я не уверен, работает ли он).

private static class ProxyDesktopManager implements DesktopManager {

    private final DesktopManager delegate;

    public ProxyDesktopManager(DesktopManager delegate) {
        this.delegate = Objects.requireNonNull(delegate);
    }

    // Check whether frame is moveable
    private boolean checkFrameMovable(JComponent frame) {
        if (frame instanceof JInternalFrame) {
            // TODO check whether the frame if movable

        }
        return false;
    }

    @Override
    public void beginDraggingFrame(JComponent f) {
        if (checkFrameMovable(f)) {
            delegate.beginDraggingFrame(f);
        }
    }

    @Override
    public void dragFrame(JComponent f, int newX, int newY) {
        if (checkFrameMovable(f)) {
            delegate.dragFrame(f, newX, newY);
        }
    }

    @Override
    public void endDraggingFrame(JComponent f) {
        if (checkFrameMovable(f)) {
            delegate.endDraggingFrame(f);
        }
    }

    @Override
    public void openFrame(JInternalFrame f) {
        delegate.openFrame(f);
    }

    @Override
    public void closeFrame(JInternalFrame f) {
        delegate.closeFrame(f);
    }

    @Override
    public void maximizeFrame(JInternalFrame f) {
        delegate.maximizeFrame(f);
    }

    @Override
    public void resizeFrame(JComponent f, int newX, int newY, int newWidth, int newHeight) {
        delegate.resizeFrame(f, newX, newY, newWidth, newHeight);
    }

    // IMPORTANT: simply delegate all another methods like openFrame or 
    // resizeFrame
}

Теперь вы можете использовать этот прокси-класс для вашего JDesktopPane

JDesktopPane desktop = new JDesktopPane();
desktop.setDesktopManager(new ProxyDesktopManager(desktop.getDesktopManager()));
...