web-dev-qa-db-fra.com

Java: Ajouter un défilement dans la zone de texte

Comment puis-je ajouter la barre de défilement à ma zone de texte. j'ai essayé avec ce code mais cela ne fonctionne pas.

            middlePanel=new JPanel();
        middlePanel.setBorder(new TitledBorder(new EtchedBorder(), "Display Area"));

        // create the middle panel components

        display = new JTextArea(16, 58);
        display.setEditable(false); // set textArea non-editable
        scroll = new JScrollPane(display);
        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

        //Add Textarea in to middle panel
        middlePanel.add(scroll);
        middlePanel.add(display);

Merci

23
Ravi

Après avoir ajouté JTextArea dans JScrollPane ici:

scroll = new JScrollPane(display);

Vous n'avez pas besoin de l'ajouter à nouveau dans un autre conteneur comme vous le faites:

middlePanel.add(display);

Supprimez simplement cette dernière ligne de code et cela fonctionnera bien. Comme ça:

    middlePanel=new JPanel();
    middlePanel.setBorder(new TitledBorder(new EtchedBorder(), "Display Area"));

    // create the middle panel components

    display = new JTextArea(16, 58);
    display.setEditable(false); // set textArea non-editable
    scroll = new JScrollPane(display);
    scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

    //Add Textarea in to middle panel
    middlePanel.add(scroll);

JScrollPane est juste un autre conteneur qui place des barres de défilement autour de votre composant lorsque cela est nécessaire et a également sa propre disposition. Tout ce que vous devez faire lorsque vous voulez envelopper quelque chose dans un parchemin suffit de le passer dans le constructeur JScrollPane:

new JScrollPane( myComponent ) 

ou définir la vue comme ceci:

JScrollPane pane = new JScrollPane ();
pane.getViewport ().setView ( myComponent );

Supplémentaire:

Voici un exemple pleinement fonctionnel puisque vous ne l'avez toujours pas fait fonctionner:

public static void main ( String[] args )
{
    JPanel middlePanel = new JPanel ();
    middlePanel.setBorder ( new TitledBorder ( new EtchedBorder (), "Display Area" ) );

    // create the middle panel components

    JTextArea display = new JTextArea ( 16, 58 );
    display.setEditable ( false ); // set textArea non-editable
    JScrollPane scroll = new JScrollPane ( display );
    scroll.setVerticalScrollBarPolicy ( ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS );

    //Add Textarea in to middle panel
    middlePanel.add ( scroll );

    // My code
    JFrame frame = new JFrame ();
    frame.add ( middlePanel );
    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

Et voici ce que vous obtenez: enter image description here

50
Mikle Garin

Mon hypothèse naïve était que la taille du volet de défilement sera déterminée automatiquement ...

La seule solution qui a réellement fonctionné pour moi était en supprimant explicitement les limites de JScrollPane :

import javax.swing.*;

public class MyFrame extends JFrame {

    public MyFrame()
    {
        setBounds(100, 100, 491, 310);
        getContentPane().setLayout(null);

        JTextArea textField = new JTextArea();
        textField.setEditable(false);

        String str = "";
        for (int i = 0; i < 50; ++i)
            str += "Some text\n";
        textField.setText(str);

        JScrollPane scroll = new JScrollPane(textField);
        scroll.setBounds(10, 11, 455, 249);                     // <-- THIS

        getContentPane().add(scroll);
        setLocationRelativeTo ( null );
    }
}

Peut-être que cela aidera certains futurs visiteurs :)

5
LihO

Essayez d'ajouter ces deux lignes à votre code. J'espère que ça marchera. Ça a marché pour moi :)

display.setLineWrap(true);
display.setWrapStyleWord(true);

L'image de sortie est montrée ci-dessous

enter image description here

2
farhangdon