Hallo alle zusammen,
ich habe eine Frage in Bezug auf Berechnungen des sichtbaren Bereichs:
Folgender Aufbau:
Hauptfenster: JFrame
RootView-Ebene: rootContainer (Typ: JScrollPane)
Viewport des rootContainer: mainPanel (Typ: JPanel)
mainPanel enthält weitere Unterpanels vom Typ JPanel (z. B. kindPanel)
kindPanel enthält mehrere Suggestfield-Elemente, diese sind abgeleitet von JTextfield. Das Suggestfield entspricht einer Google-Suche (Textfeld mit angelagerter Vorschlagsliste, die anhand der Eingabe durchsucht und verkürzt wird).
Zu diesem Zweck enthält das Suggestfield einen JDialog (Besitzer: Hauptfenster-Frame (Typ: JFrame))
JDialog enthält wiederum ein JScrollPane, dessen ViewPort ist ein JList-Feld.
Angelehnt hab ich mich dabei hier:
JSuggestField - The JTextField that makes suggestions | rakudave.ch
Allerdings zeigt dieses die Liste immer an, egal ob im sichtbaren Bereich oder nicht. Deshalb enthält mein Suggestfield die unten aufgeführte Prüffunktion.
Leider ist der Code sehr umfangreich, deshalb die obige Beschreibung ohne Beispiel-Code. Die Aufgabe ist nun, das aufklappbare JList-Feld nur dann anzuzeigen (Pfeiltaste nach unten), wenn es vollständig in den sichtbaren Bereich reinpasst, bzw. es beim Scrolling zu prüfen und entsprechend auszublenden. Das funktioniert auch ganz gut, lediglich nach dem Start der Komponente kommt es bei Suggestfields, die knapp am unteren Rand des rootContainers liegen vor, dass er das Listenfeld in die linke obere Ecke (vermutlich Koordinaten 0,0 des rootContainers oder mainPanels) setzt. Hier die Prüffunktion:
Meine Vermutung:
Ich müsste mit rootContainer.getViewport().getViewRect() arbeiten und das mit SwingUtilities.convertPointToScreen() passend konvertieren, aber irgendwo ist noch der Wurm drin. Könnte es sein, dass hier auch die Nicht-Thread-Sicherheit von Swing mitreinspielt?
Schon mal danke im Voraus, ich hoffe, ich konnte den Aufbau und das Problem halbwegs rüberbringen.
Gruß
wmf
ich habe eine Frage in Bezug auf Berechnungen des sichtbaren Bereichs:
Folgender Aufbau:
Hauptfenster: JFrame
RootView-Ebene: rootContainer (Typ: JScrollPane)
Viewport des rootContainer: mainPanel (Typ: JPanel)
mainPanel enthält weitere Unterpanels vom Typ JPanel (z. B. kindPanel)
kindPanel enthält mehrere Suggestfield-Elemente, diese sind abgeleitet von JTextfield. Das Suggestfield entspricht einer Google-Suche (Textfeld mit angelagerter Vorschlagsliste, die anhand der Eingabe durchsucht und verkürzt wird).
Zu diesem Zweck enthält das Suggestfield einen JDialog (Besitzer: Hauptfenster-Frame (Typ: JFrame))
JDialog enthält wiederum ein JScrollPane, dessen ViewPort ist ein JList-Feld.
Angelehnt hab ich mich dabei hier:
JSuggestField - The JTextField that makes suggestions | rakudave.ch
Allerdings zeigt dieses die Liste immer an, egal ob im sichtbaren Bereich oder nicht. Deshalb enthält mein Suggestfield die unten aufgeführte Prüffunktion.
Leider ist der Code sehr umfangreich, deshalb die obige Beschreibung ohne Beispiel-Code. Die Aufgabe ist nun, das aufklappbare JList-Feld nur dann anzuzeigen (Pfeiltaste nach unten), wenn es vollständig in den sichtbaren Bereich reinpasst, bzw. es beim Scrolling zu prüfen und entsprechend auszublenden. Das funktioniert auch ganz gut, lediglich nach dem Start der Komponente kommt es bei Suggestfields, die knapp am unteren Rand des rootContainers liegen vor, dass er das Listenfeld in die linke obere Ecke (vermutlich Koordinaten 0,0 des rootContainers oder mainPanels) setzt. Hier die Prüffunktion:
Java:
private boolean isSuggestFieldInVisibleArea()
{
//location-Variable Attribut von Suggestfield
//ScreenLocation des SuggestField
location = getLocationOnScreen();
//ScreenLocation des ScrollPane, dass das mainPanel enthält
Point ctPt = rootContainer.getLocationOnScreen();
//Sichtbare Höhe des SuggestField
location.y += getVisibleRect().height;
if (location.y > ctPt.y &&
location.y + list.getVisibleRect().height < ctPt.y
+ rootContainer.getVisibleRect().height)
{
return true;
}
else
{
return false;
}
}
Meine Vermutung:
Ich müsste mit rootContainer.getViewport().getViewRect() arbeiten und das mit SwingUtilities.convertPointToScreen() passend konvertieren, aber irgendwo ist noch der Wurm drin. Könnte es sein, dass hier auch die Nicht-Thread-Sicherheit von Swing mitreinspielt?
Schon mal danke im Voraus, ich hoffe, ich konnte den Aufbau und das Problem halbwegs rüberbringen.
Gruß
wmf