У меня есть класс, который расширяет JComponent под названием Canvas. Даже когда он больше, чем мой JScrollPane JViewport, ручки не появятся на полосах прокрутки, и я не могу прокручивать вниз Canvas. Код для моей панели прокрутки находится здесь:
final JFrame frame = new JFrame("SketchPad");
frame.setLayout(new BorderLayout());
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
JScrollPane scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
JViewport vp = scrollPane.getViewport();
vp.setLayout(null);
vp.setBackground(Color.BLUE);
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
canvas = new Canvas();
canvas.setBounds(0, 0, w, h);
vp.add(canvas);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
Я что-то делаю с JScrollPane, или это что-то еще?
vp.setLayout(null);
Не устанавливайте нулевой макет в окне просмотра. Полосы прокрутки появятся автоматически, когда предпочтительный размер компонента, добавленного в область просмотра прокрутки, больше, чем размер прокрутки.
Менеджер макетов мы использовали для определения предпочтительного размера (как правило, вы никогда не должны использовать нулевой макет).
Кроме того, не используйте Canvas, являющийся компонентом AWT. Используйте JPanel
при использовании Swing. Или, если это пользовательский класс, тогда у него должно быть более описательное имя, чтобы избежать путаницы.
add()
для добавления пользовательского класса Canvas в область просмотра панели прокрутки, он там, но прокрутка не прокручивает холст. Когда я использую new JScrollPane(canvas)
, холст вообще не появляется.
getPreferredSize()
вам необходимо переопределить метод getPreferredSize()
класса, чтобы вернуть соответствующий размер класса.