JavaFX sichtbarkeit bestimmen

Roland13

Mitglied
Ich habe datenreiche Formulare mit vielen Folder und Subfolder u.ä.
Die Daten sollen aber nur jeweils dann von der Datenbank geholt werden und komplexe Berechnungen dazu durchgeführt werden, wenn das entsprechende Element sichtbar ist.
Das klappt bei Swing problemlos mit isShowing z.B.:
Code:
if (Tbl!=null .. && !Tbl.bAktiv && ((JPanel)TabAbf.getInhalt("Pnl")).isShowing())         
        Tbl.Refresh();
Gibt es ein äquivalent dazu auch in JavaFX?
 

Roland13

Mitglied
visible liefert leider immer true, auch wenn das Element nicht sichtbar ist.
Ich bräuchte eine Property die wirklich liefert ob es aktuell am Bildschirm sichtbar ist (wie bei Swing).
 

Roland13

Mitglied
ich mach die Elemente nicht unsichtbar, sie sollen auch sichtbar sein, werden aber durch Accordion, TabPane o.ä. "verdeckt", d.h. es ist nur ein Teil der Elemente sichtbar und der soll auch Daten von der Datenbank holen und damit Berechnungen anstellen, der noch nicht sichtbare Teil soll erst dann die Daten von der Datenbank holen, wen er durchs anklicken des TabPane oder öffnen des Accordions sichtbar wird.
 

mihe7

Top Contributor
Du willst nicht wissen, was gerade auf dem Bildschirm zu sehen ist, Du willst wissen, was der Anwender gerne sehen möchte. Dafür gibt es entsprechende Properties, z. B. Accordion#expandedPaneProperty oder SingleSelectionModel#selectedItemProperty usw.
 

Roland13

Mitglied
Es geht schon darum was gerade am Bildschirm zu sehen ist.
Bei Swing liefert isShowing immer genau ob eine Komponente gerade sichtbar ist, es muss ja auch bei JavaFX so etwas ähnliches geben, sonst wäre es doch ein immenser Rückschritt.
Ich weiß nicht wie viele TabPane und Accordion wie gestaffelt am Formular vorkommen, möchte aber unabhängig davon ermitteln können was gerade gesehen werden kann.
 

mihe7

Top Contributor
Was heißt gestaffelt? Überdecken die Komponenten sich gegenseitig?

Nachtrag: Component#isShowing prüft NICHT, ob die Komponente tatsächlich sichtbar ist. Die Methode prüft lediglich, ob die visible-Property der Komponente auf true steht und gibt, wenn dies der Fall ist, den Wert von parent.isShowing() zurück.
 
Zuletzt bearbeitet:

Roland13

Mitglied
Ja, im Folder (TabPane) ist wieder ein TabPane oder ein Accordion, somit ist es gestaffelt.
Bei Swing hat es funktioniert, hab es viele Jahre so im Einsatz.
 

mihe7

Top Contributor
Ja, im Folder (TabPane) ist wieder ein TabPane oder ein Accordion, somit ist es gestaffelt.
OK, jetzt weiß ich was Du mit "gestaffelt" meinst.

Ich versuche gerade nachzuvollziehen, was Du in Deinen Programmen treibst. Ich stelle mir das so vor, dass Du eine Vielzahl von Komponenten hast, dann irgendeine Methode, in der Du die Komponenten abfragst, ob sie sichtbar sind, und dem entsprechend die DB-Abfrage gestaltest?
 

Roland13

Mitglied
Ja, ich stelle ein Werkzeug zur Verfügung ein Formular zu definieren, wie das Formular im Nachhinein aussehen wird, das weiß ich natürlich nicht, es können dann Tabellen mit Abfragen in Accordions versteckt sein, die wieder in TabPane sind, die in TabPanes sind ...
Er soll aber die Datenbank nur dann belästigen, wenn etwas wirklich sichtbar ist, nicht vom 2. Folder etwas darstellen (und von der Datenbank holen) obwohl der Benutzer immer nur am 1. Folder bleibt.
 

Roland13

Mitglied
Im Moment hab ich es so aufgebaut, dass bei Sichtbarkeit die Abfrage und somit die Tabelle refresht wird (mit aktuellen Stammsatz und Zeitraum) (s. Source am Anfang).
Die Frage ist ob ich das Umdrehen kann und die Tabelle einen Event auslöst, wenn sie dargestellt wird.
d.h. auch wenn sie am Anfang keine Zeilen hat nur dann ermittelt ob es Zeilen zum darstellen gibt wenn sie sichtbar wird.
 

Roland13

Mitglied
Ich weiß, das das Accordion ein Event auslöst, das hätte ich auch so vorgesehen, nur müsste ich dann wissen ob der Bereich dadurch sichtbar wird, was ja scheinbar nur in Swing möglich ist, aber nicht bei JavaFX.
Deshalb war meine Idee das ganze umzudrehen, sodass die Tabelle (TreeTableView) einen Event (oder besser gesagt Listener) auslöst, der mir liefert ob die Tabelle neu aufgebaut werden will.
nun zu meinem kurzen Beispiel-Source-Code:
Das TabAbf ist eine interne Tabelle, die mir in einer Schleife die entsprechenden Panels (bei Swing JPanel) liefert.
Nur wenn diese gerade angezeigt werden, dann soll die darauf platzierte Tabelle (in diesem Fall Tbl) erneuert werden, d.h. Daten dafür von der Datenbank geholt werden, Berechnungen mit weiteren Daten von der Datenbank geholt werden, der Inhalt berechnet werden und am Schluss dargestellt werden.
Tbl steht im Swing-Fall für eine Ableitung der Klasse JCTable oder JCOutliner.
Bei JavaFX wäre das eine Ableitung von Klasse TreeTableView oder TableView.
 

mihe7

Top Contributor
dann wissen ob der Bereich dadurch sichtbar wird
Ich verstehe das Problem nicht: wenn ich z. B. auf einen Tab wechsle, dann wird dessen Inhalt sichtbar. Mal in Code:

Java:
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.control.Accordion;
import javafx.scene.control.Label;
import javafx.scene.control.TitledPane;
import javafx.scene.Scene;
import javafx.scene.Node;
import javafx.stage.Stage;

public class Test extends Application {
    private Label l1 = new Label("Nix");
    private Label l2 = new Label("Nix");

    private Task<String> createTask(final Label lbl) {
        return new Task<String>() {
            @Override
            protected String call() {
                // simuliert lange db abfrage
                try { Thread.sleep(1000); } catch (Exception ex) {}
                return Integer.toString((int)(Math.random() * 1000));
            }

            @Override
            protected void succeeded() {
                lbl.setText(getValue());
            }
        };
    }

    @Override
    public void start(Stage primary) {
        Accordion a = new Accordion();
        a.getPanes().add(new TitledPane("T1", l1));
        a.getPanes().add(new TitledPane("T2", l2));

        a.expandedPaneProperty().addListener((what, old, value) -> {
            if (value != null) {
                Label lbl = "T1".equals(value.getText()) ? l1 : l2;
                lbl.setText("Lade...");
                new Thread(createTask(lbl)).start();
            }
        });

        primary.setScene(new Scene(a,300, 200));
        primary.show();
    }

    private void print(Node n) {
        if (n != null) {
            System.out.println(n.toString() + " " + n.isVisible());
            print(n.getParent());
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Gültigkeitsbereich (Sichtbarkeit) von Instanzvariablen (Swing-widgets) AWT, Swing, JavaFX & SWT 6
B Sichtbarkeit von Modifiern erweiterbar? AWT, Swing, JavaFX & SWT 3
R Swing Sichtbarkeit der Swing Komponenten AWT, Swing, JavaFX & SWT 2
Z Problem mit (Un)Sichtbarkeit von Komponenten AWT, Swing, JavaFX & SWT 3
A Abfrage nach Sichtbarkeit vom JFram AWT, Swing, JavaFX & SWT 3
M ScreenCapture bestimmten Bereich bestimmen AWT, Swing, JavaFX & SWT 3
A Radio Buttons sollen den Text der text Area bestimmen AWT, Swing, JavaFX & SWT 9
S Swing Zahl der Zeilenumbrüche in einer JTextArea bestimmen AWT, Swing, JavaFX & SWT 1
M Jtable - wie position einer Celle bestimmen bei Multiselect AWT, Swing, JavaFX & SWT 4
N Swing Optimale Höhe eine JTextPanes bei festgelegter Breite bestimmen AWT, Swing, JavaFX & SWT 23
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
A Größe von Textfield bestimmen AWT, Swing, JavaFX & SWT 9
R JTextField Eingabe bestimmen AWT, Swing, JavaFX & SWT 5
aze GeneralPath wie eine Parabel: Scheitelpunkt bestimmen AWT, Swing, JavaFX & SWT 9
H * Einlesen von Text-Dateien & Zeichensatz bestimmen AWT, Swing, JavaFX & SWT 2
P Swing Größe eines JPanels bestimmen (ohne Border!) AWT, Swing, JavaFX & SWT 2
S Bestimmen ob Bereich im Bild eher Schwarz oder Weiss ist? AWT, Swing, JavaFX & SWT 13
D JTree Text bestimmen AWT, Swing, JavaFX & SWT 8
H SWT Breite von componenten zu bestimmen AWT, Swing, JavaFX & SWT 2
S Standpunkt von Componenten frei bestimmen AWT, Swing, JavaFX & SWT 10
G Dimensionen eines Button bestimmen AWT, Swing, JavaFX & SWT 4
G Größe eines Applets bestimmen AWT, Swing, JavaFX & SWT 6
S Farbe der Canvas an X,Y bestimmen? AWT, Swing, JavaFX & SWT 7
B JEditorPane: Höhe für bestimmte Breite bestimmen AWT, Swing, JavaFX & SWT 4
M Farbe bestimmen, wenn JTextField.setEnabled(false) AWT, Swing, JavaFX & SWT 6
F Bildgröße bestimmen AWT, Swing, JavaFX & SWT 2
W JButton grösse bestimmen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben