2010-12-12 14 views
4

Ich versuche nur eine vertikale Bildlaufleiste zu meinem TextField und TextArea hinzuzufügen. Ich benutze ein ScrollPane und es sollte standardmäßig eine vertikale/horizontale Bildlaufleiste erstellen.JScrollBar Vertikale/Horizontale Einstellung Problem - Java Swing

Problem: Ich brauche eine vertikale Bildlaufleiste, um die Daten zu sehen, die nicht sichtbar ist. Am Anfang wird eine vertikale Bildlaufleiste angezeigt, aber wenn die Daten zunehmen, wird die vertikale Bildlaufleiste zu einer horizontalen Bildlaufleiste. Auch das TextField verschwindet und nur eine horizontale Bildlaufleiste erscheint an seiner Stelle. Ich denke, es ist, weil ich die Grenzen gesetzt habe, aber ich habe versucht, die Grenzen zu ändern, und es endet vollständig mit dem TextField.

Mein Code-Schnipsel:

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

Frage:

Gibt es einige Parameter ich so einstellen müssen, dass es sich um eine vertikale Bildlaufleiste bleibt? Warum belegt die Eingabe-Bildlaufleiste das gesamte Eingabefeld, wenn die Daten zu einer großen Zeile werden? Es erscheint als eine richtige vertikale Bildlaufleiste am Anfang.

Jeder Ratschlag geschätzt.

Danke

+0

Scrollbar auf einem JTextField? – khachik

+0

Können Sie ein kleines kompilierbares und ausführbares Beispiel erstellen und veröffentlichen? Was passiert auch, wenn Sie die bevorzugte Größe des JViewports von JScrollPane und nicht von JScrollPane selbst festlegen? –

Antwort

3

Unten ist ein kleines kompilierbares Codefragment, das ich oben erwähnt habe. Ich stimme mit camickr überein, dass man keine absolute Positionierung verwenden sollte, sondern die Layout-Manager. Wenn Sie unbedingt eine horizontale Bildlaufleiste für das JTextField benötigen, können Sie sie mit dem JScrollPane-Konstruktor, der dies ermöglicht, immer anzeigen lassen. das heißt,

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

Für z.B.

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

Sie sollten niemals die bevorzugte Größe des Textbereichs festlegen, wenn die Rollbalken ordnungsgemäß funktionieren sollen. Rollbalken werden angezeigt, wenn die bevorzugte Größe des Textbereichs größer ist als die Größe des Bildlaufbereichs. Wenn Sie die bevorzugte Größe des Rollbereichs fest codieren Textbereich dann das Hinzufügen von Text hat keinen Einfluss auf seine bevorzugte Größe. – camickr

+0

Danke für den Vorschlag und die Korrektur! Sie sind natürlich richtig. Ich werde den Beitrag oben bearbeiten, um dies zu reflektieren. –

+0

Hallo .. Ich habe Folgendes versucht: (InputField, JScrollPane. VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); Einstellung für meinen Bildlaufbereich .. aber es gab keinen Unterschied.Entwickelt horizontalen Bereich, wenn die Daten die Größe meines Textfelds überschritten haben :( – JJunior

1

Spiel nicht mit den Grenzen. Verwenden Sie einen Layout-Manager und Sie müssen sich nicht darum kümmern.

Wenn Sie das Textfeld so etwas wie zu erstellen:

JTextField textField = new JTextField(10); 

Dies erzeugt ein Textfeld, das ein Minimum von 10 Zeichen halten wird. Wenn die Anzahl der Zeichen die Anzeigebreite des Textfelds überschreitet, kann der Benutzer die verbleibenden Zeichen mit den Pfeiltasten rechts/links sehen. Das ist die normale Benutzeroberfläche, die von allen Anwendungen verwendet wird, die ich je gesehen habe. Versuchen Sie nicht, Ihre eigene Benutzeroberfläche mithilfe einer horizontalen Bildlaufleiste zu erstellen. Die Benutzer sind nicht daran gewöhnt.

für den Textbereich Sie es mit erstellen:

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

einen Textbereich mit 5 Reihen zu erstellen und zu ca. 30 Zeichen pro Zeile.

Jetzt fügen Sie das Textfeld und den Bildlaufrahmen zu Ihrem Bild "mit Layout-Manager" und dann packen Sie den Rahmen. Die Layout-Manager bestimmen die beste Größe für die Komponenten. Bildlaufleisten werden automatisch im Textbereich angezeigt, wenn Sie Text hinzufügen und der Text 5 Zeilen überschreitet.

+0

Aus irgendeinem Grund kann ich Ihre Antwort nicht bewerten. :( –