2010-12-12 4 views
4

J'essaie juste d'ajouter une barre de défilement verticale à mes TextField et TextArea. J'utilise un ScrollPane et il devrait créer une barre de défilement horizontal/vertical 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. Au démarrage, une barre de défilement verticale apparaît, mais lorsque les données augmentent, la barre de défilement verticale est remplacée par une barre de défilement horizontale. Le TextField disparaît également et seule une barre de défilement horizontale apparaît à sa place. Je suppose que c'est parce que j'ai défini les limites, mais j'ai essayé de changer les limites et cela a complètement éliminé le TextField.JScrollBar Problème de réglage Vertical/Horizontal- Java Swing

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 la barre de défilement d'entrée occupe-t-elle le champ d'entrée entier lorsque les données deviennent une ligne énorme? Il apparaît comme une barre de défilement verticale appropriée au début.

Un conseil apprécié.

Merci

+0

Scrollbar sur un JTextField? – khachik

+0

Pouvez-vous créer et publier un petit exemple compilable et exécutable? En outre, que se passe-t-il si vous définissez la taille préférée du JViewport de JScrollPane et non le JScrollPane lui-même? –

Répondre

3

Je suis d'accord avec camickr que vous ne devriez pas utiliser le positionnement absolu mais plutôt utiliser les gestionnaires de disposition. Si vous avez absolument besoin d'une barre de défilement horizontale pour le JTextField, alors une façon de le faire fonctionner est de toujours l'afficher, en utilisant le constructeur JScrollPane qui le permet. i.e.,

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

Pour 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(); 
      } 
     }); 
    } 
} 
+2

Vous ne devez jamais définir la taille préférée de la zone de texte si vous voulez que les srollbars fonctionnent correctement.Les barres de défilement apparaissent lorsque la taille préférée de la zone de texte est supérieure à la taille du panneau de défilement. la zone de texte, puis l'ajout de texte n'a aucun effet sur sa taille préférée – camickr

+0

Merci pour la suggestion et la correction! Vous avez bien sûr raison.Je vais modifier le poste ci-dessus pour refléter cela .. –

+0

Hi .. J'ai essayé ceci: (inputField, JScrollPane. VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); paramètre pour mon volet de défilement .. mais il n'y avait pas de différence. Terminé obtenir volet horizontal lorsque les données ont dépassé la taille de mon champ de texte. :( – JJunior

1

Ne pas jouer avec les limites. Utilisez un gestionnaire de disposition et vous n'aurez pas à vous en préoccuper.

Lorsque vous créez le champ de 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 de texte, l'utilisation permet de voir les caractères restants en utilisant les touches fléchées droite/gauche. C'est l'interface utilisateur normale utilisée par toutes les applications que j'ai jamais vues. N'essayez pas de créer votre propre interface 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 lignes et environ 30 caractères par ligne.

Maintenant, ajoutez le champ de texte et le scrollpane à votre cadre "en utilisant des gestionnaires de disposition", puis emballez le cadre. Les gestionnaires de disposition détermineront la meilleure taille pour les composants. Les barres de défilement apparaissent automatiquement dans la zone de texte lorsque vous y ajoutez du texte et que le texte dépasse 5 lignes. Ci-dessous est un petit extrait de code compilable que j'ai mentionné ci-dessus.

+0

Pour une raison quelconque, je ne peux pas voter pour votre réponse. :( –