pack() lässt Ränder

W

wizard9

Gast
Ich habe in meinem JFrame eine Content-Pane mit FlowLayout erstellt. Dieser habe ich dann wiederum eine JComponent hinzugefügt, deren Größe ich über setPreferredSize() und ein anschließendes revalidate() während der Laufzeit ändere. Anschließend rufe ich auf meinem JFrame pack() auf, um die Größes des Fensters exakt der Größe meiner JComponent anzupassen.

War das Fenster vor der Größenänderung der JComponent zu klein zur Darstellung, arbeitet pack() wie gewünscht und vergrößert es so weit, dass meine JComponent exakt reinpasst. Ziehe ich das Fenster jedoch vorher manuell größer, sodass pack() verkleinern muss, klappt das nur bedingt: Es bleiben rechts und unterhalb meiner JComponent immer Ränder übrig.

Dass die JComponent in Wirklichkeit größer sein könnte als gedacht (nämlich genau um diesen beschriebenen Rand) kann ich eigentlich ausschließen, da ich mit folgendem Aufruf eine ScrollPane verwende:

Java:
setContentPane(new JScrollPane(contentPane));
und hier erscheinen die Scrollbars eben erst, wenn ich das Fenster am Ende manuell noch genau um die auftretenden Ränder verkleinere, d.h. die Content-Pane (und somit auch die darin liegende JComponent) kann nicht größer sein als gedacht. Es muss irgendwie an einer Kombination aus pack() und der Fenstergröße vor dem Aufruf von pack() liegen.

Weiß von euch jemand, wie ich dieses Problem beheben könnte?

Gruß
Wizard
 

Ebenius

Top Contributor
:cool: Das kann ich bestätigen.

Hier ein KSKB das den Bug demonstriert und einen Workaround aufzeigt:
Java:
/* $Id$ */

/* Copyright 2010 Sebastian Haufe

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.*;
import java.awt.event.ActionEvent;

import javax.swing.*;

public class JScrollPanePackTestGui {

  static void createAndShowGui() {
    final JPanel scrolledContent =
          new JPanel(new FlowLayout(SwingConstants.LEADING)) {

            @Override
            protected void paintComponent(Graphics g) {
              super.paintComponent(g);
              g.setColor(Color.RED);
              final Dimension prefSize = getPreferredSize();
              final int w = prefSize.width;
              final int h = prefSize.height;
              g.drawRect(0, 0, w - 1, h - 1);
              g.setColor(Color.GREEN);
              g.drawRect(0 + 1, 0 + 1, w - 3, h - 3);
              g.setColor(Color.BLACK);
              g.drawRect(0 + 2, 0 + 2, w - 5, h - 5);
            }
          };
    scrolledContent.setPreferredSize(new Dimension(200, 200));
    scrolledContent.add(new JButton(new AbstractAction("Bug") {

      public void actionPerformed(ActionEvent e) {
        final Window w =
              SwingUtilities.getWindowAncestor((Component) e.getSource());
        w.pack();
      }
    }));
    scrolledContent.add(new JButton(new AbstractAction("Workaround") {

      public void actionPerformed(ActionEvent e) {
        final JRootPane rootPane =
              SwingUtilities.getRootPane((Component) e.getSource());
        rootPane.setSize(1, 1);
        rootPane.validate();
        final Window w = SwingUtilities.getWindowAncestor(rootPane);
        w.pack();
      }
    }));

    final JFrame f = new JFrame("Test Frame: JScrollPanePackTestGui"); //$NON-NLS-1$
    f.setContentPane(new JScrollPane(scrolledContent));
    f.pack();
    f.setSize(f.getWidth() + 1, f.getHeight() + 1);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }
}
Ebenius
 
W

wizard9

Gast
Wunderbar, dein Workaround funktioniert einwandfrei. :) Es handelt sich also offenbar tatsächlich um einen Bug in der Swing-Bibliothek!?

In der Zwischenzeit hatte ich auch noch herausgefunden, dass es gerade an der JScrollPane liegt. Es scheint genau der Platz zusätzlich zu bleiben, den man für die Darstellung der Scrollbalken bräuchte, aber es werden eben gar keine dargestellt (da sie ja auch nicht benötigt werden).
 

Ebenius

Top Contributor
Wunderbar, dein Workaround funktioniert einwandfrei. :) Es handelt sich also offenbar tatsächlich um einen Bug in der Swing-Bibliothek!?
Vermute ich auch. Ich habe nicht danach gesucht, kann mir aber kaum vorstellen, dass der Bug noch nicht in der Bug-Parade auftaucht.

In der Zwischenzeit hatte ich auch noch herausgefunden, dass es gerade an der JScrollPane liegt. Es scheint genau der Platz zusätzlich zu bleiben, den man für die Darstellung der Scrollbalken bräuchte, aber es werden eben gar keine dargestellt (da sie ja auch nicht benötigt werden).
Ich stimme auch hier zu. Es ist laut meiner Beobachtung (und ohne näheres hinsehen) genau der Platz für die JScrollBars.

Ebenius
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing pack() Problem mit Taskleiste AWT, Swing, JavaFX & SWT 4
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
H AWT setSize()/setBounds() und pack() kombinieren!? AWT, Swing, JavaFX & SWT 3
N SWT Text pack() macht Text zu klein AWT, Swing, JavaFX & SWT 2
M SWT pack() von org.eclipse.swt.widgets.Control AWT, Swing, JavaFX & SWT 8
C JFrame und pack() / validate() AWT, Swing, JavaFX & SWT 3
M pack() awt funktioniert falsch AWT, Swing, JavaFX & SWT 3
G pack() ? AWT, Swing, JavaFX & SWT 2
S e(fx)clipse erscheint nicht im Marketplace, lässt sich nicht installieren AWT, Swing, JavaFX & SWT 16
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
M Umwandlung in den HSV-Farbraum lässt die Grafik pixelig werden AWT, Swing, JavaFX & SWT 8
R Textfield lässt sich nicht positionieren AWT, Swing, JavaFX & SWT 1
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
P Gui lässt sich nicht starten AWT, Swing, JavaFX & SWT 10
R JavaFX lässt sich nicht in Eclipse einbinden AWT, Swing, JavaFX & SWT 4
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
T .jar-Datei lässt sich unflexibler ausführen als über die IDE AWT, Swing, JavaFX & SWT 11
D JavaFX Label lässt sich nicht mehrmals färben AWT, Swing, JavaFX & SWT 7
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
W JTextfield - Wert lässt sich nicht setzen AWT, Swing, JavaFX & SWT 3
kaoZ Swing JFrame lässt sich nicht über dispose() abbauen AWT, Swing, JavaFX & SWT 0
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
A Panel lässt sich nicht bewegen AWT, Swing, JavaFX & SWT 2
M JavaFX WebView lässt sich nur einmal öffnen AWT, Swing, JavaFX & SWT 2
S JPanel lässt die CPU heisslaufen AWT, Swing, JavaFX & SWT 3
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
B setCursor() lässt Cursor ganz verschwinden AWT, Swing, JavaFX & SWT 9
D JSplitPane lässt sich nicht verschieben AWT, Swing, JavaFX & SWT 3
T jTable Spaltenbreite lässt sich nicht ändern AWT, Swing, JavaFX & SWT 8
J Swing Fenster lässt sich nach Schließung nicht wieder öffnen AWT, Swing, JavaFX & SWT 4
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
qwerqer Swing JDialog Darstellungsprobleme - Dialog lässt sich nicht schließen AWT, Swing, JavaFX & SWT 3
R Durch Listener lässt sich Programm nicht mehr ausführen AWT, Swing, JavaFX & SWT 4
Burny91 Swing Vertical JSplitPane lässt sich nicht nach rechts verschieben AWT, Swing, JavaFX & SWT 2
J Hintergrundbild des JFrames lässt Textboxen verschwinden? AWT, Swing, JavaFX & SWT 4
M Swing [JTextPane] Cursor lässt sich nicht mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 3
A JToolbar lässt sich aus dem Fenster lösen AWT, Swing, JavaFX & SWT 2
D Swing Button lässt sich nicht drücken AWT, Swing, JavaFX & SWT 5
B Heavyweight Popup lässt keine MouseEvents durch AWT, Swing, JavaFX & SWT 2
G JFormattedTextField lässt sich nicht mehr leeren AWT, Swing, JavaFX & SWT 4
X RCP/SWT/JFace: Sprache lässt sich nicht ändern AWT, Swing, JavaFX & SWT 3
P jTable mit Model lässt sich nicht neu laden AWT, Swing, JavaFX & SWT 5
A Problem mit JList! Textfarbe lässt sich nicht ändern! AWT, Swing, JavaFX & SWT 7
J JScrollBar lässt sich nicht auf minimum setzten AWT, Swing, JavaFX & SWT 7
K Fenster lässt sich nicht schließen =( AWT, Swing, JavaFX & SWT 16
H JSplitPane lässt sich nicht über rechtes Panel ziehen AWT, Swing, JavaFX & SWT 2
TheJavaKid font lässt sich bei der jtextarea nur einmal ändern AWT, Swing, JavaFX & SWT 3
G Menue lässt sich nicht einschalten AWT, Swing, JavaFX & SWT 3
F SWT Dialog lässt sich nur einmal öffnen AWT, Swing, JavaFX & SWT 3
H Tabsize in JTextArea lässt sich nicht ändern AWT, Swing, JavaFX & SWT 3
T Color lässt sich nicht verändern AWT, Swing, JavaFX & SWT 3
M frame lässt sich nicht schliessen AWT, Swing, JavaFX & SWT 7
K Programm lässt sich nicht beenden AWT, Swing, JavaFX & SWT 9
X Sudoku - Breitere Ränder AWT, Swing, JavaFX & SWT 18
LittleJavaCup Bild zuschneiden (unterschiedliche Ränder) AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben