JContentPane? JScrollbar? JViewport

Wie kann man auf ein bereits existentes JFrame Scrollbars anwenden? Ein Container wurde bereits mittels
Code:
meinframe.getContentPane()
erstellt, beschrieben und wieder geleert, ein Versuch ein JContentPane im seperaten Thread zu initialisieren bleibt anscheinend ergebnislos, meine JLabels werden nicht angezeigt
 
Moin!
Verstehe nicht so ganz was du vorhast. Wenn ich dich richtig verstehe, möchtest du ein komplettes JFrame Scrollable machen?
So einfach funktioniert das nämlich nicht, denn scrollfähig sind erstmal nur die Komponenten, welche auch das Interface
Scrollable implementieren. Müsstest dir also eine eigene JFrame Klasse erstellen, welche dieses Interface implementiert.

Eventuell gibts aber auch andere einfachere Möglichkeiten, aber dazu musst du erstmal erzählen, was du denn genau vorhast..

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
ah, das is ma ne hilfreiche Info, danke.

Kann ich das hinzufügen einer ScrollBar innnerhalb eines Frames mit nicht-scrollbaren Elementen irgendwie erzingen?

Die "Aufgabe" an mich selbst ist ganzt einfach: einen grösseren Satz aus Daten formatiert und geordnet ausgeben, optimalerweise sollten das teilweise JLabels und JButtons sein (1. Eintrag in jeder Zeile: JButton, die anderen: JLabels). Alle Zeilen zusammen sollten scrollbar sein, es sind einige hundert.
 
Zuletzt bearbeitet:
Moin!
Mir würden nur 2 Möglichkeiten einfallen.
Entweder du erstellst dir eine eigene Klasse, die meinentwegen von JPanel erbt und da Scrollable Interface implementiert. Darin fügst du deine ganzen Labels und Buttons ein und das Panel insgesamt dann in das ScrollPane.

Was auch ne Möglichkeit wäre, das ganze in eine Tabelle zu packen diese ist nämlich scrollbar. Dazu müsstest du dann natürlich einen eigenen Renderer erstellen, der dir in der ersten Spalte einen Button darstellt.
Ich habe noch nie das Scrollable Interface implentiert, kann dir daher nicht sagen, wie schwer das ist.. Schon aus dem Grund würde ich persönlich die zweite Möglichkeit bevorzugen.. Aber die Wahl überlass ich dir :) Und vielleicht kennt ja jemand noch eine bessere Lösung..


*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Moin!
Entweder du erstellst dir eine eigene Klasse, die meinentwegen von JPanel erbt und da Scrollable Interface implementiert. Darin fügst du deine ganzen Labels und Buttons ein und das Panel insgesamt dann in das ScrollPane.
Das versuch ich grad ... da GridBag mir schon Koppschmerzen bereitet hat, jetzt aber endlich wie gewünscht anzeigt (nur mittels Konstruktor!!) will ich nicht mit NOCH einem Layout Ärger bekommen ....

Also: Ich habe jetzt ein seperates ScrollPane erstelle, mein Frame per setContentPane darauf verwiesen, mein altes Pane mit Inhalt gefüllt und Scrollable implementiert. Wie kann ich jetzt mein ScrollPane mit einem JPanel befüllen? Ich sehe nur "add" im Angebot, aber das erwartet ja eine Komponente, keinen kompletten Container!
Reicht es aus, wenn ich das JFrame per setContenPane auf das ScrollPane verweise?
 
Zuletzt bearbeitet:
Moin!
Code:
ScrollablePanel sp = new ScrollablePanel(); //implementiert Scrollable
/**
buttons und labels in sp einfügen
**/
Srollpane scroller = new ScrollPane();
scroller.setViewportView(sp);
meinframe.getContentPane().add(scroller);

*grüssle*
MeinerEiner
 
vielen Dank ... zeitgleich hab ichs auch gelöst :p, war ganz einfach:
Java:
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.ScrollPane;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 *
 * @author tha_specializt
 */
public class testklasse {
    
    /** Creates a new instance of testklasse */
    public testklasse() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        GridBagLayout layout = new GridBagLayout();
        panel.setLayout(layout);
        ScrollPane scrollpane = new ScrollPane();
        frame.setContentPane(scrollpane);
        scrollpane.add(panel);
        int spalte = 1;
        int zeile = 1;
        Insets keine = new Insets(0,0,0,0);
        String text = "DUMMYTEXT";
         while(true) {
            if(zeile > 100)
                break;
            if(spalte > 6) {
                spalte = 1;
                zeile++;
            }
            int padx = 50;
            if(spalte == 1)
                padx = 0;
                
            GridBagConstraints constr = new GridBagConstraints(     spalte,zeile,
                                                                    1,1,
                                                                    0.0,0.0,
                                                                    GridBagConstraints.WEST,0,
                                                                    keine,padx,0);
            
            //                                                      int gridx, int gridy,
            //                                                      int gridwidth, int gridheight,
            //                                                      double weightx, double weighty,
            //                                                      int anchor, int fill,
            //                                                      Insets insets, int ipadx, int ipady) { 
             
             
                 if(spalte == 1)
                     panel.add(new JButton(text), constr);
                 else
                     panel.add(new JLabel(text), constr);                 
             
             spalte++;             
        }        
        panel.setVisible(true);
        scrollpane.setVisible(true);
        frame.setVisible(true);
        frame.setPreferredSize(new Dimension(500,500));
        frame.pack();
        
    }
    public static void main(String[] args) {
        new testklasse();
    }
    
}
 
Zurück