JScrollPane verhält sich nicht so wie gedacht

  • Themenstarter Themenstarter seraphim91
  • Beginndatum Beginndatum
S

seraphim91

Gast
Hallo zusammen,

bin gerade dabei ein Programm für die Schule ein wenig mit einer GUI aufzupeppen, aber so ganz klappt das noch nicht...
Ich möchte, dass die Textarea einen Scrollbalken bekommt, da das Erzeugte, das in das Textarea geschrieben wird, sehr viel länger sein kannt, als das Textarea groß ist!

Bisher sieht mein Code so aus:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ta_scroll
{
    private JFrame frame;
    private JLabel lb_eingabe;
    private JTextField txt_eingabe;
    private JTextArea txta_ausgabe;
    private JButton btn_start;
    private JScrollPane sp_ausgabe;

    public ta_scroll()
    {

        //Frame erzeugen
        frame=new JFrame("Autovermietung");

        //Layoutmanager = FlowLoyout
        frame.getContentPane().setLayout(new FlowLayout());
        frame.setPreferredSize(new Dimension(420,510));

        //Objekte erzeugen und Eigenschaften setzen
        lb_eingabe=new JLabel("Anzahl zu erzeugender Fahrzeuge:");
        txt_eingabe=new JTextField();
        txt_eingabe.setPreferredSize(new Dimension(200,25));
        txta_ausgabe=new JTextArea();
        txta_ausgabe.setPreferredSize(new Dimension(400,400));
        txta_ausgabe.setLineWrap(true);
        sp_ausgabe=new JScrollPane(txta_ausgabe);
        sp_ausgabe.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        btn_start=new JButton("Erzeugen!");

    }

    public void launchFrame()
    {

        //Objekte hinzufügen
        frame.getContentPane().add(lb_eingabe);
        frame.getContentPane().add(txt_eingabe);
        frame.getContentPane().add(btn_start);
        frame.getContentPane().add(txta_ausgabe);
        frame.getContentPane().add(sp_ausgabe);

        //Java-Prozess beenden wenn Fenster verlassen wird
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        //ActionListener auf Button legen und Zielmethode zuweisen
        btn_start.addActionListener(new ActionListener()
               {
                   public void actionPerformed(ActionEvent e)
                   {
                       //Erzeugung starten
                       erzeugen();
                   }
               }
         );
         
        frame.pack();
        frame.setVisible(true);
    }

    public void erzeugen()
    {

        //Erzeugungs-Algorithmus
        
    }

}

Wenn ich das ganze so laufen lasse, bekomme ich zwar eine ScrollPane, die ist aber winzig klein und hängt unterhalb des Textareas... sitze bereits Stunden davor, aber finde diesen Fehler einfach nicht. Hilfe wäre toll 🙂

MfG
seraphim91
 
Hallo seraphim91,

wir dürfen nicht die JTextArea, sondern nur JScrollPane zur GUI hinzufügen (JScrollPane enthält ja schon die JTextArea). Desgleichen dürfen wir nicht die PreferredSize der JTextArea ändern, sondern diejenige der JScrollPane. Hier habe ich außerdem die Namen gemäß den Java Coding Conventions angepasst und eine "main" Methode zum Testen hinzugefügt:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class TaScroll {

    private JFrame frame;
    private JLabel lbEingabe;
    private JTextField txtEingabe;
    private JTextArea txtaAusgabe;
    private JButton btnStart;
    private JScrollPane spAusgabe;

    public TaScroll() {

        //Frame erzeugen
        frame = new JFrame("Autovermietung");

        //Layoutmanager = FlowLoyout
        frame.getContentPane().setLayout(new FlowLayout());
        frame.setPreferredSize(new Dimension(420, 510));

        //Objekte erzeugen und Eigenschaften setzen
        lbEingabe = new JLabel("Anzahl zu erzeugender Fahrzeuge:");
        txtEingabe = new JTextField();
        txtEingabe.setPreferredSize(new Dimension(200, 25));
        txtaAusgabe = new JTextArea();
        txtaAusgabe.setLineWrap(true);
        spAusgabe = new JScrollPane(txtaAusgabe);
        spAusgabe.setPreferredSize(new Dimension(400, 400));
        spAusgabe.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        btnStart = new JButton("Erzeugen!");

    }

    public void launchFrame() {

        //Objekte hinzufügen
        frame.getContentPane().add(lbEingabe);
        frame.getContentPane().add(txtEingabe);
        frame.getContentPane().add(btnStart);
//        frame.getContentPane().add(txtaAusgabe);
        frame.getContentPane().add(spAusgabe);

        //Java-Prozess beenden wenn Fenster verlassen wird
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //ActionListener auf Button legen und Zielmethode zuweisen
        btnStart.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                //Erzeugung starten
                erzeugen();
            }
        });

        frame.pack();
        frame.setVisible(true);
    }

    public void erzeugen() {
        //Erzeugungs-Algorithmus
        txtaAusgabe.append("test\n\n");
    }

    public static void main(final String... args) {
        Runnable gui = new Runnable() {

            public void run() {
                TaScroll ta_scroll = new TaScroll();
                ta_scroll.launchFrame();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
Gruß,
André
 
Ah, wunderbar. Danke für den Hinweis! Habe das bisher immer so verstanden, dass die Scrollpane quasi über das Textarea "drübergelegt" wird.
Die main-Methode hatte ich in einem anderen .java-File drinstehen, deswegen stand die nicht in meinem Code drin.
 

Zurück
Oben