2016-05-05 18 views
0

Ich habe derzeit eine Java-Anwendung, die eine Instanz von verwendet, um Daten für den Benutzer anzuzeigen. Sie drücken eine Taste, und Daten aus einer Datenbank werden aufgefüllt.JTextArea Scroll-Funktionalität

Es gibt keine vertikale Bildlaufleiste und die Tabellen in der Datenbank enthalten mehr Zeilen als auf den Bildschirm passen.

Wie kann ich diesem Textbereich eine vertikale Bildlaufleiste hinzufügen?

Viele Teile des Codes hängen davon ab, an diezu schreiben, und es wäre ein enormer Zeitaufwand, den Code zu refaktorieren, um ihn an einen anderen Behältertyp anzupassen.

Gibt es eine Möglichkeit, die JTextArea in eine ScrollPane zu verpacken?

Aktuelle Code (die Textarea zeigt ohne Scrollbalken):

/** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 1057, 484); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     JTextArea mainTextArea = new JTextArea(); 

     mainTextArea.setLineWrap(true); 
     mainTextArea.setWrapStyleWord(true); 
     mainTextArea.setBounds(21, 93, 995, 336); 
     frame.getContentPane().add(mainTextArea); 
    // (continued...) 

Mein Versuch, den Code in einem Bildlauffenster Einwickeln (weder der Textbereich noch die Bildlaufleisten angezeigt):

/** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 1057, 484); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     JTextArea mainTextArea = new JTextArea(); 

     mainTextArea.setLineWrap(true); 
     mainTextArea.setWrapStyleWord(true); 
     mainTextArea.setBounds(21, 93, 995, 336); 
     JScrollPane scroll = new JScrollPane (MainTextArea); 
     scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     frame.getContentPane().add(scroll); 
     frame.getContentPane().setVisible(true); 
    // (continued...) 
+2

* „Wie kann ich eine vertikale Bildlaufleiste zu diesem Textbereich hinzufügen?“ * Lassen Sie es ia ' JScrollPane'. Beachten Sie jedoch, dass dies nicht funktioniert, wenn Sie 'null' Layouts verwenden. Java-GUIs müssen auf verschiedenen Betriebssystemen, Bildschirmgrößen, Bildschirmauflösungen usw. mit verschiedenen PLAFs in verschiedenen Locales arbeiten. Als solche sind sie nicht für ein perfektes Pixel-Layout geeignet. Verwenden Sie stattdessen Layout-Manager oder [Kombinationen davon] (http://stackoverflow.com/a/5630271/418556) zusammen mit Layout-Auffüllung und Rahmen für [Leerraum] (http://stackoverflow.com/a/17874718/ 418556). –

+2

1) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. 2) Bereitstellung von ASCII-Grafiken oder einer einfachen Zeichnung des * beabsichtigten * Layouts der GUI bei minimaler Größe und wenn sie in der Größe veränderbar ist, mit mehr Breite und Höhe. 3) Bitte lerne die übliche Java-Nomenklatur (Benennungskonventionen - z. B. 'EachWordUpperCaseClass',' firstWordLowerCaseMethod() ',' firstWordLowerCaseAttribute', es sei denn, es ist ein 'UPPER_CASE_CONSTANT') und benutze es konsistent. –

+2

Lesen Sie den Abschnitt aus dem Swing-Lernprogramm zu [Wie Sie Textbereiche verwenden] (http://docs.oracle.com/javase/tutorial/uiswing/components/textarea.html) für ein funktionierendes Beispiel. Laden Sie den Code herunter und verwenden Sie ihn als Ausgangspunkt für Ihre Klasse. Der Code wird ordnungsgemäß strukturiert sein und den Swing-Konventionen folgen. Es ist erstaunlich, wie Andrew so viele Probleme mit deinen 10 Zeilen Code finden konnte. Deshalb müssen Sie Swing richtig programmieren, indem Sie mit dem Demo-Code im Tutorial beginnen. Und halten Sie einen Link zum Tutorial praktisch für alle Swing-Grundlagen. – camickr

Antwort

1

paar Fehler gemacht Sie

frame.getContentPane().setLayout(null);

  • Diese Anweisung entfernt die Standardborder im Zusammenhang mit JFrame und jetzt ist es kein Layout.

  • Da das Layout des JFrame Null wurde, müssen Sie die setBounds() -Methode für JScrollpane verwenden, bevor Sie es zum JFrame hinzufügen, sonst wird es nicht sichtbar.

  • Wenn Sie so etwas wie dieses scroll.setBounds(21, 93, 995, 336); gesetzt werden Sie in der Lage sein, die JScrollPane sehen hinzugefügt JFrame

HINWEIS:frame.getContentPane().setVisible(true); werden Ihre JFrame sichtbar machen Sie dies als frame.setVisible(true) ändern müssen.

Versuchen Sie immer, Layouts in Swing statt Null Layout zu verwenden.Wenn Sie Null-Layout verwenden, müssen Sie die SetBounds manuell, die nicht in guter Weise UI in Schwung zu entwerfen.

Komplette Arbeits Code ohne jegliche Layout mit:

package com.jd.swing; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 

public class JFrameExample {`enter code here` 
private JFrame frame; 

private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 1057, 484); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 
    JTextArea MainTextArea = new JTextArea(); 
    MainTextArea.setLineWrap(true); 
    MainTextArea.setWrapStyleWord(true); 
    MainTextArea.setBounds(21, 93, 995, 336); 
    JScrollPane scroll = new JScrollPane(MainTextArea); 
    scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
    scroll.setBounds(21, 93, 995, 336); 
    frame.getContentPane().add(scroll); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    new JFrameExample().initialize(); 
} 
} 

Output Screen

0

Nur zur Information,

Wenn Sie mehrere Zeilen in dem Textbereich haben, ist die Bildlaufleiste standardmäßig gescrollt das Ende des Textbereichs.Um zu halten die Linien im Textbereich eingewickelt und Bildlaufleiste nach oben auf den Textbereich, folgenden Code würde helfen

MainTextArea.setWrapStyleWord(true); 
MainTextArea.setLineWrap(true); 
DefaultCaret caret = (DefaultCaret) MainTextArea.getCaret(); 
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);