2012-02-22 3 views
17

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

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

  1. Создание окна JFrame меньше, чем размер JPanel не показывает полосы прокрутки

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

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

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

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); 

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

Дэвид

+8

узнавайте соглашения об именах Java и придерживаться их – kleopatra

+2

Когда вы говорите _ScrollPane.setViewportView (JPanel); Я предполагаю, что вы имеете в виду экземпляр JPanel _ImageCanvas –

ответ

13

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); 
      } 
     }); 
    } 
} 
0

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

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

+0

Привет, Puce, спасибо за предложения, оказалось, мне нужно было добавить jPanel «держателя» в scrollView, а затем дать ему менеджер компоновки, чтобы получить желаемый эффект. – FiniteRed

1
  • Установить предпочтительный размер на холсте.
  • Увеличение размеров 100,100 слишком мало по крайней мере на моем компьютере.
  • Возможно, вы захотите использовать новый GridLayout (1,1); для вас JFrame, если вы хотите, чтобы scrollpane расширялась при расширении рамки.
7
// 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(); 
+0

frame.pack(); любил его. –

0

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

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

boolean getScrollableTracksViewportWidth(); 

boolean getScrollableTracksViewportHeight(); 
Смежные вопросы