Java JPanel внутри JScrollPane?
У меня есть JFrame, в этом JFrame у меня есть JPanel, который я рисую, эта панель может быть любого размера, и поэтому я поместил ее в JScrollpane, чтобы позволить мне прокручивать, когда панель больше размера экрана.
К сожалению, не работает так, как я ожидал:
-
Если окно JFrame меньше размера JPanel не показывает полосы прокрутки
-
Теперь размер JScrollPane заблокирован размером с JPanel, который я добавил к нему, где, как и раньше, он изменился до границ окна JFrame (он все еще делает это, но только вертикально сейчас?!)
-
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);
Большое спасибо
Дэвид
Ответы
Ответ 1
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);
}
});
}
}
Ответ 2
// 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();
Ответ 3
- Установите предпочтительный размер на холсте.
- Увеличение размеров 100,100 слишком мало по крайней мере на моем компьютере.
- Возможно, вы захотите использовать новый GridLayout (1,1); для вас JFrame, если вы хотите, чтобы scrollpane расширялась при расширении фрейма.
Ответ 4
Насколько я помню, есть 2 варианта:
Подробнее см. Javadoc:
http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html
Ответ 5
Проверьте интерфейс Scrollable
, это может помочь в проблемах с размерами.
Эти два метода могут быть полезны:
boolean getScrollableTracksViewportWidth();
boolean getScrollableTracksViewportHeight();