web-dev-qa-db-fra.com

Comment faire défiler un JFrame en Java?

J'ai ce code dans lequel j'essaye de faire rentrer un panneau déroulant (JPanel) mais je ne le comprends pas. Voici mon code:

public class Sniffer_GUI extends JFrame {
Canvas c = new Canvas();
ConnectorPropertiesPanel props;
public Sniffer_GUI() {
    super("JConnector demo");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    getContentPane().setLayout(new GridBagLayout());
    init();

    getContentPane().add(new JLabel("Connectors example. You can drag the connected component to see how the line will be changed"),
                         new GridBagConstraints(0, 0, 2, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0));
    getContentPane().add(initConnectors(),
                         new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
    getContentPane().add(props,
                         new GridBagConstraints(1, 1, 1, 1, 0, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(5, 0, 5, 5), 0, 0));
    setSize(800, 600);
    setLocationRelativeTo(null);

}

Merci d'avance.

Je modifie pour ajouter un code qui semble partiellement fonctionner ...

public Sniffer_GUI() {
    super("JConnector demo");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel container = new JPanel();
    JScrollPane scrPane = new JScrollPane(container);
    add(scrPane);
    scrPane.setLayout(new ScrollPaneLayout());
    init();

    add(initConnectors());

    setSize(800, 600);
    setLocationRelativeTo(null);

}

Mais ce n'est pas toujours faisable, au moins ça rend sa fonction dans un JScrollPane, c'est une bonne étape.

9
Joe Lewis

Faites un JPanel déroulant et utilisez-le comme conteneur, à peu près comme ceci:

JPanel container = new JPanel();
JScrollPane scrPane = new JScrollPane(container);
add(scrPane); // similar to getContentPane().add(scrPane);
// Now, you can add whatever you want to the container
19
Eng.Fouad

Pour prolonger @ Eng.Fouad répondre:

public class Sniffer_GUI extends JFrame {
    Canvas c = new Canvas();
    ConnectorPropertiesPanel props;
    public Sniffer_GUI() {
        super("JConnector demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel container = new JPanel();
        JScrollPane scrPane = new JScrollPane(container);
        getContentPane().add(scrPane);
        container.setLayout(new GridBagLayout());
        init();

        container.add(new JLabel("Connectors example. You can drag the connected component to see how the line will be changed"),
                             new GridBagConstraints(0, 0, 2, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0));
        container.add(initConnectors(),
                             new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));
        container .add(props,
                             new GridBagConstraints(1, 1, 1, 1, 0, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(5, 0, 5, 5), 0, 0));
        setSize(800, 600);
        setLocationRelativeTo(null);

    }
}
6
Guillaume Polet

Peut-être que ça va aider ...

JFrame frame = new JFrame();
JPanel panel = new JPanel();

// add something to you panel...
// panel.add(...);

// add the panel to a JScrollPane
JScrollPane jScrollPane = new JScrollPane(panel);
// only a configuration to the jScrollPane...
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

// Then, add the jScrollPane to your frame
frame.getContentPane().add(jScrollPane);
6

Pour faire défiler un composant d'un JFrame, enveloppez-le dans un JScrollPane:

    JScrollPane myJScrollPane = new JScrollPane(myJLabel,
         JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
         JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

et remplacez les mentions de myJLabel par myJScrollPane. Travaillé pour moi.

1
gherson

Vous pouvez me corriger si vous ne vous sentez pas bien, mais utiliser JScrollPane comme cela a pour conséquence involontaire de nécessiter un redimensionnement plus fréquent de la fenêtre.

Par exemple, j'avais un programme dans lequel je configurais un panneau de défilement JFrame-wide. JTextArea se trouvait également dans un onglet du cadre de la même taille que le volet de contenu. Cette zone de texte était également dans son propre panneau de défilement (il s’agissait plus d’un projet compliqué que d’autre chose). Lorsque j'ai chargé le contenu d'un fichier à déposer dans textArea, les barres de défilement autour de la zone de texte ont été déclenchées.

Le résultat est que mon, appelons-le innerScrollPane, était maintenant plus grand que le JFrame en raison des barres de défilement, qui n'étaient pas visibles auparavant. Cela a ensuite déclenché ce que je vais maintenant appeler outerScrollPane, pour afficher ses barres de défilement, qui recouvraient ensuite les barres de défilement intérieures.

Cela a été facilement résolu en ajoutant un argument supplémentaire window.pack () à la fin de ma méthode d'ouverture de fichier, mais je voulais simplement jeter cela dehors. Les barres de défilement peuvent potentiellement masquer le contenu de la fenêtre si vous ne faites pas attention. Mais ... eh bien, il existe un million de façons de prévenir ce problème, ce n'est donc pas une grosse affaire. Juste quelque chose à être au courant.

1
user2223059

Essaye ça:

JScrollPane sp = new JScrollPane();
this.add(sp).
sp.add( *GUI elements for your applications.*)

Quelque chose comme ça devrait marcher pour vous. Jetez un coup d'oeil à this ainsi:

0
Logard