2009-09-06 6 views
12

Comment faire un JPanel défilable? Je mis en œuvre l'interface scrollable encore lors de l'ajout au panneau contenant avecScrollable JPanel

tabbedPane.add("Editor", new JScrollPane(storeyEditor = new MNScrollablePanel())); 

rien ne fonctionne

code:

public class MNScrollablePanel extends JPanel implements Scrollable { 

    public Dimension getPreferredScrollableViewportSize() { 
     return getPreferredSize(); 
    } 

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return 10; 
    } 

    public boolean getScrollableTracksViewportHeight() { 
     return false; 
    } 

    public boolean getScrollableTracksViewportWidth() { 
     return false; 
    } 

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { 
     return 10; 
    } 
} 

Répondre

8

Vous devez utiliser un JScrollPane. Et puis appelez le setViewportview(Component);

Vous n'avez pas à mettre en œuvre scrollable, JPanel est allready scrollable

+3

Vous pouvez ajouter n'importe quel composant à un JScrollPane, qu'il implémente Scrollable ou non, mais l'implémentation de Scrollable vous donnera plus de contrôle. JPanel n'implémente pas Scrollable, donc vous devez le sous-classer si vous voulez plus de contrôle sur le comportement du volet de défilement lors de l'affichage du panneau. –

+0

(Ou vous pouvez définir des propriétés sur 'JScrollPane' /' JScrollBar's sans implémenter quoi que ce soit.) –

+0

@Dan: Oui, mais je n'ai jamais dit 'implements' –

1

Comme mentionné dans tous les autres affichage il n'y a aucune raison de mettre en œuvre la vous-même l'interface Scrollable. Cependant, si vous ne faites que jouer, le code de base affiché semble raisonnable. Cependant, vous n'avez pas posté votre programme de démonstration montrant comment vous utilisez ce code. À l'avenir, postez un SSCCE avec votre question. Si vous ne savez pas ce qu'est un SSCCE, alors cherchez sur le web. Un problème possible est que les barres de défilement apparaissent automatiquement lorsque la "taille préférée" du composant ajouté à la fenêtre d'affichage du panneau de défilement est supérieure à la taille du panneau de défilement. Par conséquent, si vous effectuez une peinture personnalisée sur le panneau, vous êtes responsable de la définition de la taille préférée du panneau lors de son changement. Si vous utilisez un panneau avec des composants et un gestionnaire de disposition, vous n'avez pas à vous en préoccuper. Mais si vous utilisez des composants avec un gestionnaire de mise en page nul, vous aurez également des problèmes.

C'est pourquoi nous avons besoin d'un SSCCE car nous ne connaissons pas le contexte d'utilisation du panneau.

0

J'ai une nouvelle solution pour vous.

Je pense que vous devez utiliser ce code:

storyEditor = new JPanel(); 
storyEditor.setPreferredSize(new Dimension(..., ...)); // Insert Here your size for the editor 
JScrollPane scroller = new JScrollPane(storyEditor); 
tabbedPane.add("Editor", scroller)); 
frame.setSize(frame.getWidth()+1, frame.getHeight()); // frame is the JFrame where the tabbed pane is into 
// Maybe you can replace "frame" with "this" 
// You need to resize your frame. Why, I don't know... 
frame.pack(); 
// Your original size will be restored by calling pack 

Ce fut une solution pour moi. J'espère pour toi!

22

Il a travaillé avec moi comme ça ....

JPanel test = new JPanel(); 
test.setPreferredSize(new Dimension(2000,2000)); 
JScrollPane scrollFrame = new JScrollPane(test); 
test.setAutoscrolls(true); 
scrollFrame.setPreferredSize(new Dimension(800,300)); 
this.add(scrollFrame); 
+0

Notez que vous n'avez aucun contrôle sur l'incrément de défilement, c'est-à-dire que chaque clic sur le bouton de défilement ou chaque tour de la souris entraîne le défilement d'un pixel que vous devez surmonter - en cas de besoin - en exécutant Scrollable. –

1

JPanel n'implémente pas Scrollable. Il est préférable d'utiliser JXPanel de SwingX, qui implémente Scrollable et a beaucoup plus de fonctionnalités.