Dynamisches Ändern der Größe in JPanel mit paint()-Methode

Status
Nicht offen für weitere Antworten.

lorion42

Mitglied
Hallo,
erstmal ärgerlich, dass ich nicht Pain(t) im Titel benutzen darf :lol:
ich will dynamisch Informationen zu bestimmten Inhalten erzeugen. Das Fenster soll dabei eine passende Größe haben. Ist der Inhalt in keiner paint Methode und besteht nur aus JLabels, ist dies ganz einfach:
Code:
        informationFrame = new JFrame("Informationen");
        JPanel information = new InformationPanel();
        informationFrame.add(information);
        informationFrame.setVisible(true);
        informationFrame.pack();

Nun habe ich das InformationPanel ein wenig geändert und es hat besagte Paint-Methode. Der Paint Teil hat aber keine spezifische Größe, weswegen ich mir versucht hab mit ein paar Variablen zu helfen:

Code:
public class InformationPanel extends JPanel {

    @Override
    public void paint(Graphics g) {
        super.paintComponent(g);
        int width = 0;
        int height = 0;
        if (this.connection == null) {
            String displayString = "keine Informationen vorhanden";
            g.drawString(displayString, 5, 15);
            width += fontMetrics.stringWidth(displayString) + 5;
            height += fontMetrics.getHeight() + 15;
        }
        this.setSize(new Dimension(width, height));
    }

Der Teil mit den FontMetrics hat jetzt erstmal keine Bedeutung und soll nur ein Beispiel sein, wie sich die Fenstergröße dynamisch ändern könnte. Das Wichtige ist das setSize, denn das funktioniert nicht so, wie ich das möchte - bzw es hat gar keine Auswirkung. Hat jemand eine Ahnung, was man hier machen kann? Ich versuch schon wie ein verrückter repaint oder revalidate aufzurufen, aber es hat keine Auswirkungen.
Ich hoffe ihr versteht mein Problem :)
 

Wildcard

Top Contributor
Erstmal: überschreib nicht paint, sondern paintComponent
Aber das wichtigste: eine paint Methode darf keinen Zustand verändern. Welches Problem willst du denn lösen, da gibt es sicher einen anderen Weg.
 

lorion42

Mitglied
das war auch nur die erste Idee... ich will, dass die Fenstergröße abhängig von dem Teil ist, der in paintComponent (paint geht auch, ist aber weniger schön, aber in diesem Beispiel egal) berechnet wird.
Einzige Alternative, die mir einfällt, ist dass ich die Berechnung noch ein zweites Mal in einer anderen Methode durchführe, die nur ausrechnet, wie groß das Fenster sein müsste, um alles darzustellen, was in der paintMethode erschaffen wird... das finde ich aber sehr unschön... kennt jemand eine Alternative?
 

Wildcard

Top Contributor
Ein Beispiel aus der BasicLabelUI die die Größe eines JLabels berechnet:
Code:
public Dimension getPreferredSize(JComponent c) 
    {
        JLabel label = (JLabel)c;
        String text = label.getText();
        Icon icon = (label.isEnabled()) ? label.getIcon() :
                                          label.getDisabledIcon();
        Insets insets = label.getInsets(viewInsets);
        Font font = label.getFont();

        int dx = insets.left + insets.right;
        int dy = insets.top + insets.bottom;

        if ((icon == null) && 
            ((text == null) || 
             ((text != null) && (font == null)))) {
            return new Dimension(dx, dy);
        }
        else if ((text == null) || ((icon != null) && (font == null))) {
            return new Dimension(icon.getIconWidth() + dx, 
                                 icon.getIconHeight() + dy);
        }
        else {
            FontMetrics fm = label.getFontMetrics(font);

            iconR.x = iconR.y = iconR.width = iconR.height = 0;
            textR.x = textR.y = textR.width = textR.height = 0;
            viewR.x = dx;
            viewR.y = dy;
            viewR.width = viewR.height = Short.MAX_VALUE;

            layoutCL(label, fm, text, icon, viewR, iconR, textR);
            int x1 = Math.min(iconR.x, textR.x);
            int x2 = Math.max(iconR.x + iconR.width, textR.x + textR.width);
            int y1 = Math.min(iconR.y, textR.y);
            int y2 = Math.max(iconR.y + iconR.height, textR.y + textR.height);
            Dimension rv = new Dimension(x2 - x1, y2 - y1);

            rv.width += dx;
            rv.height += dy;
            return rv;
        }
    }
Dein JPanel sollte also getPreferredSize überschreiben so das es einen sinnvollen Wert zurückliefert. Ändert sich nun die Datenbasis die du zeichnen möchtest, rufst du einfach revalidate auf und der LayoutManager wird deine überschrieben getPreferredSize Methode konsultieren.
 

lorion42

Mitglied
Das ist schonmal ganz praktisch... aber eigentlich geht es mir nicht um JLabel... das hab ich da nur eingefügt, damit das Beispiel nicht so aufgebläht wirkt... eigentlich bastel ich eine Visualisierung für einen Graphen
also auf die paintComponent Methode werd ich nicht verzichten können...
ich mach es jetzt einfach mit einer Standartgröße und einer JScrollBar drum herum - anscheinend kann man die Größe von etwas Gezeichnetem nicht so leicht bestimmen...
 

Wildcard

Top Contributor
Das label sollte doch auch nur ein Beispiel sein. Deshalb sagte ich auch du sollst die getPreferredSize Methode sinnvoll ausfüllen.
Angenommen du möchtest eine Liste von Shapes zeichnen.
Dann gehst du in einer Schleife über deine Liste, holst dir die Bounds des ersten, addest die des zweiten hinzu, die des dritten und so weiter. Am ende hast du die BoundingBox die deiner benötigten Größe entspricht.
 

Wildcard

Top Contributor
Ungeschicktes Blacklist Script aus Spamschutzgründen. Wird mit der neuen Software hoffentlich besser.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
D Swing Dynamisches Dialog UI AWT, Swing, JavaFX & SWT 8
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
T dynamisches Koordinatenkreuz mit scalierung AWT, Swing, JavaFX & SWT 7
C Scollpane an dynamisches GridLayout anpassen? AWT, Swing, JavaFX & SWT 3
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
N Swing Dynamisches Verhalten bei Änderung Fenstergröße AWT, Swing, JavaFX & SWT 6
trash Dynamisches Interface AWT, Swing, JavaFX & SWT 6
H LayoutManager Dynamisches Layout AWT, Swing, JavaFX & SWT 3
T Swing Dynamisches Bild AWT, Swing, JavaFX & SWT 8
T RCP-SWT dynamisches ScrolledComposite AWT, Swing, JavaFX & SWT 2
B dynamisches Spektrogramm in Java-Webanwendung AWT, Swing, JavaFX & SWT 3
G LookAndFeel Dynamisches Einlesen von LookAndFeels - NullPointerException AWT, Swing, JavaFX & SWT 4
M Dynamisches generieren und ausrichten von Komponenten AWT, Swing, JavaFX & SWT 11
T Dynamisches hinzufügen und entfernen von Bildern AWT, Swing, JavaFX & SWT 3
J Dynamisches füllen von GridBagLayout: Größe der Komponenten AWT, Swing, JavaFX & SWT 4
S GUI, dynamisches Wechseln von JPanels in einem JFrame AWT, Swing, JavaFX & SWT 2
L Dynamisches Erzeugen eines Button AWT, Swing, JavaFX & SWT 2
M Schwieriges Label - Font - Problem "Dynamisches Label&a AWT, Swing, JavaFX & SWT 7
C Dynamisches Zuweisen von Daten an eine JTable zur Laufzeit AWT, Swing, JavaFX & SWT 4
C ActionListener für dynamisches Menü AWT, Swing, JavaFX & SWT 8
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
R Swing JOptionPane Sprache Ändern AWT, Swing, JavaFX & SWT 4
Tronert JavaFX Fehler beim Ändern der font-weight AWT, Swing, JavaFX & SWT 7
E Swing Miserable Performance beim Ändern der Hintergrundfarbe von JLabels AWT, Swing, JavaFX & SWT 3
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
R Ändern Default-Verhalten von JScrollpane in einer JScrollpane AWT, Swing, JavaFX & SWT 1
K JButton Problem beim Schriftfarbe Ändern AWT, Swing, JavaFX & SWT 2
E Swing Verzögerung beim Hinzufügen / Ändern von Swingkomponenten AWT, Swing, JavaFX & SWT 3
L "Fremdes" JPanel von MouseEvent aus Ändern AWT, Swing, JavaFX & SWT 2
philipp Ändern des Inhalts eines Containers nicht möglich AWT, Swing, JavaFX & SWT 2
M Swing Ändern des Themes einer fremden Applikation AWT, Swing, JavaFX & SWT 8
S Swing Threads und das Ändern des Hintergrundes ... AWT, Swing, JavaFX & SWT 2
A Schriftfarbe von jTabbedPane und Button Ändern AWT, Swing, JavaFX & SWT 7
A JTappedPane layout Ändern? AWT, Swing, JavaFX & SWT 7
P JList Index Ändern Problem AWT, Swing, JavaFX & SWT 4
P Bug in Java? - Problem beim Ändern von Spaltentiteln AWT, Swing, JavaFX & SWT 2
vogella JTable - Hinzufügen von Datensätzen und Ändern von Daten AWT, Swing, JavaFX & SWT 2
T Ändern des Default-Aussehens einer JComboBox AWT, Swing, JavaFX & SWT 3
C Ändern eines JTextFields bei DocumentListener Event AWT, Swing, JavaFX & SWT 2
C Seiteneffekte beim Ändern der Größe des Frames AWT, Swing, JavaFX & SWT 8
G Ändern der Standartschrift vom LookAndFeel AWT, Swing, JavaFX & SWT 4
R "\t" LnF abhängig !? - Ändern? AWT, Swing, JavaFX & SWT 7
T TreeModel: Ändern der Folderanzeige AWT, Swing, JavaFX & SWT 3
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
Yonnig JavaFX Größe von WebView an Content anpassen AWT, Swing, JavaFX & SWT 3
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
D JavaFX Größe des Bild an ImageView anpassen AWT, Swing, JavaFX & SWT 3
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
L JavaFX AnchorPane an die Größe der Scene oder Window binden? AWT, Swing, JavaFX & SWT 3
K JavaFX Component Größe an Inhalt anpassen AWT, Swing, JavaFX & SWT 11
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
R Größe von Scene und stage an grid anpassen AWT, Swing, JavaFX & SWT 4
M Java FX größe der shapes anpassen AWT, Swing, JavaFX & SWT 0
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
C Swing JFrame ändert Größe AWT, Swing, JavaFX & SWT 0
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
J Swing Pane im SplitPane automatische Größe aktivieren AWT, Swing, JavaFX & SWT 0
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
M Swing Mehrere Textfelder mit ScrollBars - Größe der Felder AWT, Swing, JavaFX & SWT 0
L JavaFX ListView Größe anpassen AWT, Swing, JavaFX & SWT 1
Neumi5694 Größe von Komboboxen neu berechnen AWT, Swing, JavaFX & SWT 3
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
I CSS - backgroundImage - Größe automatisch an den Container anpassen AWT, Swing, JavaFX & SWT 1
C Größe des Mauszeigers ermitteln AWT, Swing, JavaFX & SWT 5
MaxG. JFrame Größe ändern AWT, Swing, JavaFX & SWT 16
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
K GridBagLayout verändert die größe? AWT, Swing, JavaFX & SWT 1
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
D JavaFX Alle Knöpfe auf die gleiche Größe AWT, Swing, JavaFX & SWT 14
G JFrame - manuell Größe verändern AWT, Swing, JavaFX & SWT 6
M LayoutManager GridBagLayout passt seine größe nicht an AWT, Swing, JavaFX & SWT 3
F Gui weicht von Designpreview ab (kein fensterrahmen, andere größe) AWT, Swing, JavaFX & SWT 13
A JPanel größe verändern AWT, Swing, JavaFX & SWT 4
M SWT ScrollPane Größe zu klein AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
W GridBagLayout Größe geben AWT, Swing, JavaFX & SWT 1
S Swing JFrame hat nicht die Größe, die ich eingegeben habe AWT, Swing, JavaFX & SWT 3
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
T Swing Größe des Randes AWT, Swing, JavaFX & SWT 2
C LayoutManager JFrame größe und ausrichtung + Position von Fensterelementen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben