Swing Mehrere Textfelder in Scrollpane einfügen und dann zum Scrollen bringen?

Fazzoletti9

Mitglied
Hallo,
ich habe folgendes Problem: Ich möchte durch das druecken eines Knopfes zu einer ScrollPane Textfelder hinzu fügen, das ist auch kein problem nur soll diese Scrollpane, dann wenn es dann zu viele Felder sind um sie alle anzuzeigen an fangen zu scrollen.
So wie ich das habe sieht das ca so aus:
Java:
import java.awt.Color;
import java.awt.event.MouseEvent;

import javax.swing.*;


public class demo {
	static JFrame fenster;
	static JButton knopf;
	static JPanel panel;
	static JScrollPane scroll;
	private static JTextField[] spalte1;
	private static JTextField[] spalte2;
	private static int zeilen = 0;
	static int j =0;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		fenster = new JFrame();
		panel = new JPanel();
		panel.setBackground(Color.green);
		panel.setLayout(null);
		spalte1 = new JTextField[500];
		spalte2 = new JTextField[500];
		scroll = new JScrollPane();
		scroll.setBounds(100,50,200,200);
		fenster.setSize(400,400);
		fenster.setVisible(true);
		
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		knopf = new JButton();
		knopf.setBounds(20,20,20,20);
		knopf.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                minusClicked(evt);
            }
        });
		panel.add(knopf);
		panel.add(scroll);
		
		fenster.add(panel);
		panel.repaint();
		fenster.repaint();
	}
	
	protected static void minusClicked(MouseEvent evt) {
		spalte1[zeilen] = new JTextField();
		spalte2[zeilen] = new JTextField();
		spalte1[zeilen].setBounds(20, j, 60, 20);
		spalte2[zeilen].setBounds(120, j, 60, 20);
		scroll.add(spalte1[zeilen]);
		scroll.add(spalte2[zeilen]);
		j = j+25;
		scroll.repaint();
		panel.repaint();
		fenster.repaint();
		
	}

}

In wirklichkeit sieht es schon recht anders aus aber ich habe das fix als beispiel geschrieben. Ich hoffe ihr könnt mir helfen.
Gruß
Ben
 
in ein JScrollPane kann man mit add() nichts einfügen, etwas unglückliches Design,
man kann eine Komponente im Konstruktor oder per setViewportView() übergeben,
und zwar auch nur genau eine, mehrere gehen überhaupt nicht,
überhaupt vorher was dazu gelernt? 😉

gewiss kann man aber ein JPanel einfügen und darin dann mehrere andere Komponenten,
nach Änderung der GUI
validate();
repaint();
am JFrame aufrufen

edit:
bzw. revalidate(); am JPanel unter dem JScrollPane?
http://www.java-forum.org/awt-swing-swt/116275-repaint-richtig.html
 
Zuletzt bearbeitet von einem Moderator:
hmmmm
also ich habe es dann jetzt so umgeschrieben
Java:
import java.awt.Color;
import java.awt.event.MouseEvent;
 
import javax.swing.*;
 
 
public class Demo {
    static JFrame fenster;
    static JButton knopf;
    static JPanel panel;
    static JScrollPane scroll;
    private static JTextField[] spalte1;
    private static JTextField[] spalte2;
    private static int zeilen = 0;
    static int j =0;
    static JPanel panel1;
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        fenster = new JFrame();
        panel = new JPanel();
        panel.setBackground(Color.green);
        panel.setLayout(null);
        panel1 = new JPanel();
        panel1.setLayout(null);
        spalte1 = new JTextField[500];
        spalte2 = new JTextField[500];
        scroll = new JScrollPane(panel1);
        scroll.setBounds(100,50,200,200);
        fenster.setSize(400,400);
        fenster.setVisible(true);
        
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        knopf = new JButton();
        knopf.setBounds(20,20,20,20);
        knopf.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                minusClicked(evt);
            }
        });
        panel.add(knopf);
        panel.add(scroll);
        
        fenster.add(panel);
        panel.repaint();
        fenster.repaint();
    }
    
    protected static void minusClicked(MouseEvent evt) {
        spalte1[zeilen] = new JTextField();
        spalte2[zeilen] = new JTextField();
        spalte1[zeilen].setBounds(20, j, 60, 20);
        spalte2[zeilen].setBounds(120, j, 60, 20);
        panel1.add(spalte1[zeilen]);
        panel1.add(spalte2[zeilen]);
        j = j+25;
        scroll.repaint();
        panel.revalidate();
        fenster.validate();
        
        
        
    }
 
}

Also ich packe die Textfelder jetzt auch das Panel welches sich auf der ScrollPane befindet, es sieht jetzt zwar ein wenig schicker aus, aber eine Scrollbar kommt trotzdem nicht wenn ich zu viele Textfelder hinzufüge 🙁.

Und was heißt vorher etwas zum Scrollpanel gelernt 🙂 hatte es vorher mit einer Tabelle benutzt das war kein Problem und auch recht schick aber damit hatte ich andere Probleme 🙂
Gruß
Ben
 
ok, du hast null-Layout, da ist das wieder bisschen anders,
das JScrollPane erfährt vom panel1 nicht automatisch, wieviel Platz es benötigt, du musst die Size manuell angeben
folgende Kombi funktioniert bei mir, vielleicht nicht alle Befehle hier nötig, ausprobieren..
Java:
        panel1.setPreferredSize(new Dimension(200,100+j));
        panel1.revalidate();
        panel1.repaint();
außerdem
fenster.setVisible(true);
im Konstruktor ganz ans Ende, dann sind dort repaint() und Co. unnötig!
 

Zurück
Oben