2012-02-22 12 views
17

Ho un JFrame, in questo JFrame ho un JPanel su cui disegno, questo pannello può essere di qualsiasi dimensione e quindi l'ho inserito in un JScrollpane per farmi scorrere quando il pannello è più grande della dimensione dello schermo della finestra.Java JPanel all'interno di JScrollPane?

Purtroppo non funziona come mi aspettavo:

  1. Rendere la finestra JFrame più piccolo della dimensione JPanel non mostra le barre di scorrimento

  2. Le dimensioni JScrollPane ora sembra bloccato alle dimensioni del JPanel Ho aggiunto ad esso, dove come prima ha ridimensionato i limiti della sua finestra JFrame (è ancora un po 'fare questo, ma solo in verticale ora ?!)

  3. Il JPanel sembra assumere la dimensione del regar JScrollpane dless di quello che ho impostato per la dimensione preferita

Sono sicuro che sto facendo qualcosa di stupido, se qualcuno potesse sottolineare quello che mi sarei molto grato!

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

Molte grazie

David

+8

soddisfa impara convenzioni di denominazione java e bastone a loro – kleopatra

+2

Quando si dice _ScrollPane.setViewportView (JPanel); Immagino tu intenda l'istanza JPanel _ImageCanvas –

risposta

13

setPreferredSize() è il trucco, setMinimumSize() e anche setSize() sul componente verrà ignorato da JScrollPane. Ecco un esempio funzionante usando un bordo rosso.

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

Per quanto mi ricordo che ci sono 2 opzioni:

Per maggiori dettagli, consultare Javadoc: http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html

+0

Ciao Puce, grazie per i suggerimenti, risulta che avevo bisogno di aggiungere un jPanel 'titolare' alla scrollView e poi dargli un gestore di layout per ottenere l'effetto desiderato. – FiniteRed

1
  • Set formato preferito sulla tela.
  • Aumentare le dimensioni 100.100 è troppo piccolo almeno sul mio computer.
  • Si consiglia di utilizzare il nuovo GridLayout (1,1); per te JFrame se vuoi che lo scrollpan si espanda quando espandi il fotogramma.
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(); ri-amato. –

0

controllare l'interfaccia Scrollable, questo può aiutare con i problemi di dimensionamento.

Questi due metodo forse utile:

boolean getScrollableTracksViewportWidth(); 

boolean getScrollableTracksViewportHeight();