Question

Je suis juste essayer d'ajouter une barre de défilement verticale à mon TextField et TextArea. J'utilise un ScrollPane et il devrait créer défilement avertical / barre horizontale par défaut.

Problème: J'ai besoin d'une barre de défilement verticale pour voir les données qui ne sont pas visibles. Dans le début une affiche de barre de défilement verticale, mais lorsque les données augmente les changements de barre de défilement verticale à une barre de défilement horizontale. De plus, le TextField disparaît et seulement une barre de défilement horizontale apparaît à sa place. Je suppose que c'est parce que j'ai mis les limites mais j'essayé de changer les limites et il finit par faire complètement disparaître la TextField.

Mon extrait de code:

public JTextField inputField = new JTextField();

public  JTextArea talkArea = new JTextArea();

public JScrollPane inputFieldScroll = new JScrollPane(inputField);

public JScrollPane talkAreaScroll = new JScrollPane(talkArea);
      talkArea.setEditable(false);

    talkArea.setBackground(Color.white);

     talkAreaScroll.setBounds(new Rectangle(TALK_LEFT, TALK_TOP, TALK_WIDTH, TALK_HEIGHT));     

     this.getContentPane().add(talkAreaScroll, null);

    //set input area

      inputField.setBackground(Color.white);

    inputField.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT));

    inputFieldScroll.setVerticalScrollBar(new JScrollBar());

    inputFieldScroll.setBounds(new Rectangle(INPUT_LEFT, INPUT_TOP, INPUT_WIDTH, INPUT_HEIGHT));

Question:

Y at-il un paramètre que je dois régler pour qu'il reste une barre de défilement verticale? Pourquoi le rouleau d'entrée barre occupent l'ensemble inputfield lorsque les données devient une ligne énorme? Il apparaît comme une barre de défilement vertical approprié dans le début.

Un conseil apprécié.

Merci

Était-ce utile?

La solution

Voici un petit code compilable snippet je l'ai mentionné ci-dessus. Je suis d'accord avec camickr que vous ne devriez pas utiliser le positionnement absolu, mais plutôt d'utiliser les gestionnaires de mise en page. Si vous avez absolument besoin d'avoir une barre de défilement horizontale pour le JTextField, alors une façon de le faire au travail est de le faire apparaître toujours, en utilisant le constructeur JScrollPane qui permet. i.e.,

        JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

Pour par exemple.

import java.awt.*;
import javax.swing.*;

public class FuSwing1b extends JPanel {
    private static final int TA_ROWS = 25;
    private static final int TA_COLS = 60;
    private JTextField inputField = new JTextField();
    private JTextArea talkArea = new JTextArea(TA_ROWS, TA_COLS);

    public FuSwing1b() {
        talkArea.setEditable(false);
        talkArea.setFocusable(false);
        talkArea.setBackground(Color.white);
        //talkArea.setPreferredSize(new Dimension(TALK_WIDTH, TALK_HEIGHT));

        JScrollPane talkPane = new JScrollPane(talkArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        JScrollPane inputPane = new JScrollPane(inputField, JScrollPane.VERTICAL_SCROLLBAR_NEVER, 
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        int gap = 10;
        setLayout(new BorderLayout(gap, gap));
        add(talkPane, BorderLayout.CENTER);
        add(inputPane, BorderLayout.SOUTH);
        setBorder(BorderFactory.createEmptyBorder(gap , gap, gap, gap));
    }

    private static void createAndShowUI() {
        JFrame frame = new JFrame("FuSwing1b");
        frame.getContentPane().add(new FuSwing1b());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

Autres conseils

Ne pas jouer avec les limites. Utilisez un gestionnaire de mise en page et vous ne serez pas à vous soucier de cela.

Lorsque vous créez le champ texte utiliser quelque chose comme:

JTextField textField = new JTextField(10);

Cela va créer un champ de texte qui contiendra au minimum 10 caractères. Si le nombre de caractères dépasse la largeur d'affichage du champ texte l'utilisation peut voir les caractères restants à l'aide des touches fléchées droite / gauche. C'est l'interface normale utilisée par toutes les applications que j'ai jamais vu. Ne pas essayer de créer votre propre interface utilisateur en utilisant une barre de défilement horizontale. Les utilisateurs ne sont pas habitués à cela.

pour la zone de texte que vous pouvez créer à l'aide:

JTextArea textArea = new JTextArea(5, 30);
JScrollPane scrollPane = new JScrollPane( textArea );

pour créer une zone de texte avec 5 rangées et environ 30 caractères par ligne.

Maintenant, ajoutez le champ texte et le scrollpane à votre image « à l'aide des gestionnaires de mise en page » puis emballez le cadre. Les gestionnaires de mise en page détermineront la meilleure taille pour les compoents. Les barres de défilement apparaîtront automatiquement sur la zone de texte que vous ajoutez du texte à et le texte est supérieur à 5 lignes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top