web-dev-qa-db-fra.com

Java JPanel dans JScrollPane?

J'ai un JFrame, dans ce JFrame j'ai un JPanel sur lequel je dessine, ce panneau peut être de n'importe quelle taille et je l'ai donc placé dans un JScrollpane pour me permettre de faire défiler lorsque le panneau est plus grand que la taille de l'écran de la fenêtre.

Malheureusement, ne fonctionne pas comme prévu:

  1. Rendre la fenêtre JFrame plus petite que la taille JPanel n'affiche pas les barres de défilement

  2. La taille de JScrollPane semble maintenant verrouillée à la taille du JPanel que je lui ai ajouté, où comme auparavant, il était redimensionné aux limites de sa fenêtre JFrame (il le fait toujours, mais seulement verticalement maintenant?!)

  3. Le JPanel semble assumer la taille du JScrollpane indépendamment de ce que j'ai défini pour la taille préférée

Je suis sûr que je fais quelque chose de stupide, si quelqu'un pouvait souligner ce que je serais le plus reconnaissant!

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

Merci beaucoup

David

16
FiniteRed

setPreferredSize () est l'astuce, setMinimumSize () et même setSize () sur le composant seront ignorés par JScrollPane. Voici un exemple de travail utilisant une bordure rouge.

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);
            }
        });
    }
}
14
Spyder
// 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();
7
Andrew Thompson
  • Définissez la taille préférée sur la toile.
  • Augmenter les dimensions de 100,100 est au moins trop petit sur mon ordinateur.
  • Vous voudrez peut-être utiliser le nouveau GridLayout (1,1); pour vous JFrame si vous souhaitez que le volet de défilement se développe lorsque vous développez le cadre.
1
Ashwinee K Jha

Pour autant que je me souvienne, il y a 2 options:

Pour plus de détails, voir Javadoc: http://docs.Oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html

0
Puce

Consultez l'interface Scrollable, cela peut aider à résoudre les problèmes de dimensionnement.

Ces deux méthodes peuvent être utiles:

boolean getScrollableTracksViewportWidth();

boolean getScrollableTracksViewportHeight();
0
cdc