Java JPanel внутри JScrollPane? - PullRequest
       12

Java JPanel внутри JScrollPane?

17 голосов
/ 22 февраля 2012

У меня есть JFrame, в этом JFrame у меня есть JPanel, на котором я рисую, эта панель может быть любого размера, поэтому я поместил ее в JScrollpane, чтобы позволить мне прокручивать, когда панель больше, чем размер экрана окна.

К сожалению, не работает, как я ожидал:

  1. Если в окне JFrame меньше размера JPanel, полосы прокрутки не отображаются

  2. Размер JScrollPane теперь, кажется, привязан к размеру JPanel, который я добавил к нему, где, как и прежде, он изменил размеры до границ своего окна JFrame (он все еще делает это, но теперь только вертикально?!)

  3. Кажется, что JPanel принимает размер JScrollpane независимо от того, что я установил для предпочтительного размера

Я уверен, что я делаю что-то глупое, если бы кто-то мог указать, что я был бы очень благодарен!

JPanel _ImageCanvas = new JPanel(); // 'Canvas' to draw on
JScrollPane _ScrollPane = new JScrollPane();

// set size of 'canvas'
_ImageCanvas.setMinimumSize(new Dimension(100,100));

// Scroll pane smaller then the size of the canvas so we should get scroll bars right?
_ScrollPane.setMinimumSize(new Dimension(50,50)); 

// Add a border to 'canvas'
_ImageCanvas.setBorder(BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

_ScrollPane.setViewportView(JPanel);

Большое спасибо

David

Ответы [ 5 ]

15 голосов
/ 22 февраля 2012

setPreferredSize () - уловка, setMinimumSize () и даже setSize () для компонента будут игнорироваться JScrollPane.Вот рабочий пример с использованием красной рамки.

import java.awt.*;

import javax.swing.*;

public class Scroller extends JFrame {

    public Scroller() throws HeadlessException {
        final JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createLineBorder(Color.red));
        panel.setPreferredSize(new Dimension(800, 600));

        final JScrollPane scroll = new JScrollPane(panel);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());
        add(scroll, BorderLayout.CENTER);
        setSize(300, 300);
        setVisible(true);
    }

    public static void main(final String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Scroller().setVisible(true);
            }
        });
    }
}
7 голосов
/ 22 февраля 2012
// suggest a size of 'canvas'
_ImageCanvas.setPreferredSize(new Dimension(100,100));

// Scroll pane smaller then the size of the canvas so we should get scroll bars right?
_ScrollPane.setPreferredSize(new Dimension(50,50)); 

// ..later 
_Frame.pack();
1 голос
/ 22 февраля 2012
  • Установить предпочтительный размер на холсте.
  • Увеличение размеров 100,100 слишком мало по крайней мере на моем компьютере.
  • Возможно, вы захотите использовать новый GridLayout (1,1);для вас JFrame, если вы хотите, чтобы область прокрутки расширялась при расширении фрейма.
0 голосов
/ 22 февраля 2012

Проверьте интерфейс Scrollable, это может помочь с проблемами с размерами.

Эти два метода могут быть полезны:

boolean getScrollableTracksViewportWidth();

boolean getScrollableTracksViewportHeight();
0 голосов
/ 22 февраля 2012

Насколько я помню, есть 2 варианта:

Для получения более подробной информации см. Javadoc: http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html

...