Подтвердить что ты не робот

Прокручиваемая JDesktopPane?

Я хотел бы добавить возможность прокрутки в javax.swing.JDesktopPane. Но обертка в javax.swing.JScrollPane не создает желаемого поведения.

Поиск в Интернете показывает, что это было проблемой в течение довольно долгого времени. Есть некоторые решения, но они кажутся чтобы быть довольно старыми, и я не совсем доволен ими.

Какие активно поддерживаемые решения вы знаете?

4b9b3361

Ответ 1

Я использовал решение JavaWorld, создав собственный JScrollableDesktopPane.

Ответ 2

Я нашел это: http://www.javaworld.com/javaworld/jw-11-2001/jw-1130-jscroll.html?page=1

Это хороший учебник с большим количеством объяснений и информации о Swing и т.д., что позволяет создавать JscrollableDesktopPane с большим количеством материалов.

Вам нужно будет немного изменить некоторые части кода, чтобы выполнить ваши требования.

Наслаждайтесь!

Ответ 3

Javaworld JScrollableDesktopPane больше не доступен на их веб-сайте. Мне удалось собрать некоторые копии, но никто из них не работает.

Простым решением, которое я получил, можно добиться, выполняя что-то вроде следующего. Это не самый красивый, но он, безусловно, работает лучше, чем поведение по умолчанию.

public class Window extends Frame {
    JScrollPane scrollContainer = new JScrollPane();
    JDesktopPane mainWorkingPane = new JDesktopPane();

    public Window() {
        scrollContainer.setViewportView(mainWorkingPane);

        addComponentListener(new ComponentAdapter() {
            public void componentResized(ComponentEvent evt) {
                revalidateDesktopPane();
            }
        });
    }

    private void revalidateDesktopPane() {
        Dimension dim = new Dimension(0,0);
        Component[] com = mainWorkingPane.getComponents();
        for (int i=0 ; i<com.length ; i++) {
            int w = (int) dim.getWidth()+com[i].getWidth();
            int h = (int) dim.getHeight()+com[i].getHeight();
            dim.setSize(new Dimension(w,h));
        }
        mainWorkingPane.setPreferredSize(dim);
        mainWorkingPane.revalidate();
        revalidate();
        repaint();  
    }
}

Идея состоит в том, чтобы обернуть JDesktopPane в JScrollPane, добавить слушателя изменения размера в основной кадр и затем оценить содержимое JDesktopPane при изменении размера (или добавлении новых элементов).

Надеюсь, что это поможет кому-то там.