V-Hybrid aus JPane + JScrollPane - gibts so was?

Status
Nicht offen für weitere Antworten.

DocMcFly

Bekanntes Mitglied
Hallo,

Mein Problem sieht folgendermaßen aus:

Ich hab ein Textfeld und darunter noch andere Komponenten. Das ganze mit einem GridBagLayout layoutet.

Wenn die unteren Komponenten immer mehr werden, reicht das JPanel nicht mehr aus und unten fehlt die Hälfte.

:idea: Also hab ich ein JScrollPane drum rum gepackt und dann funktionierte es ;-)

:!: Blöderweise steht gelegentlich auch mal gaaaanz viel Text in dem oben genannten Textfeld. Dann malt mir das JScrollPane einen horizontalen Scrollbalken. Das sieht aber nicht sehr elegant aus.

Mit der Policy kann ich den horizontalen Scrollbalken abschalten, aber das Textfeld wird damit nicht am Rand beendet. Das ist auch doof - denn da hinter ist ein Button. Der ist dann nicht mehr erreichbar.

Ich such nun ein Panel, welches sich horizontal wie ein JPanel verhält und vertikal wie ein JScrollPane...

Gibts so was :?:

Danke fürs Lesen und für Antworten...
Gruß Clemens
 
Hat jemand nen Plan, wie die Größen der einzelnen Komponenten berechnet werden?

Wie macht das GridBagLayout das?

Gruß Clemens
 
Das da löst dein Problem.
Code:
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)
Und GridBagLayout ist so ziemlich der komplizierteste LayoutManager in Java. Den hier bis ins Detail zu
beschreiben würde in einem Buch ausarten.
 
nein tut es leider nicht. :cry:

Aus irgendeinem Grund geht der Inhalt über das JScrollPane hinüber.

Und wenn ich dann die Scrollbar, mittels Policy abschalte, komme ich nicht mehr an den rechten Rand. (Hab ich aber schon beschrieben. 🙁


ich hab jetzt einen eigenen ViewPort geschrieben - mit dem klappt das... nur leider ist das Konstrukt extrem langsam. Hat jemand ne Idee?

Code:
package de.ptb.exinfo.paz.xml2form.module.tools;

import java.awt.Dimension;
import javax.swing.JViewport;

public class VViewPort extends JViewport {

  public VViewPort() {
    super();
  }

  public Dimension getViewSize() {
    
      Dimension _superViewSize = super.getViewSize();
      Dimension _superSize = super.getSize();
      super.getView().setSize((int) _superSize.width, (int) _superViewSize.getHeight());
      _superViewSize.width = _superSize.width;
      this.superViewSize = _superViewSize;
    
    return this.superViewSize;
  }
}


Gruß Clemens
 
hab jetzt mal nen Zähler eingebaut...

Wie ich vermutet hab... die Methode getViewSize() wird tausende mal aufgerufen.

Dafür ist

Code:
super.getView().setSize((int) _superSize.width, (int) _superViewSize.getHeight());

verantwortlich ...

Ich forsche weiter ... weiter bitte ich um Hilfe...

Gruß Clemens
 
Hab so ne Art Lösung... für folgendes Problem:

JTextfield + JButton in einer Reihe in einem JScrollPane.

Bei sehr viel Text im JTextfield zeichnet der JScrollPane eine horizontale JScrollBar. In einem einfachen JPanel würde das nicht passieren. JTextfield würde den Text nur teilweise anzeigen und man könnte drin rum scrollen (Mit rechter und linker Cursor-Taste).

Die horizontale JScrollBar zerreißt das ganze Layout. :noe:

Darum muss man dem JViewPort in JScrollPane beibringen, das er virtuell nur so weit nach rechts geht, wie Platz für den JScrollpane da ist.

Dazu muss man folgendermaßen JViewPort ableiten und dem JScrollpane mit setViewPort beibringen.

Code:
public class VerticalViewPort extends JViewport {
  public VerticalViewPort () {
    super();
  }

  public Dimension getViewSize() {
    // Virtuelle Größe 
    Dimension _superViewSize = super.getViewSize();
    // reale Größe
    Dimension _superSize = super.getSize();

    // Vertikal größte  und Horizontal kleinste Größe nehmen...
    _superViewSize.width = Math.min((int)_superViewSize.width, (int)_superSize.width);
    _superViewSize.height = Math.max((int)_superViewSize.height, (int)_superSize.height);
    
    // Damit es keine Endlosschleife gibt, kurz raus nehmen aus dem Viewport.
    // So wird der Listener deaktiviert...
    Component _component = super.getView();
    this.remove(_component);
    _component.setSize(new Dimension(_superSize.width, (int)_superViewSize.height));
    // Dann wieder rein damit
    this.setView(_component);
     
    // Ach ja die Größe noch wieder zurück geben ;-)
    return _superViewSize;
  }
}


Vielleicht hilft's jemanden...

Gruß Clemens
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben