JavaFX Absoluter Fokus während drag Event

mirisbowring

Bekanntes Mitglied
Hi,
aktuell habe ich eine undecorated Etage, in der ein BorderPane liegt.
Das Fenster lässt sich nur unten rechts vergrößern/Verkleinern...
Ein work around für die min Size habe ich auch schon.

Jetzt habe ich allerdings ein Problem:
Wenn ich das Fenster sehr schnell kleiner ziehe, und meine Maus dann auf dem child (Panel im Border Center) landet, scheint dieses child den Focus zu bekommen, womit das Border Pane stoppt sich zu verkleinern.
Wenn ich die Maus jetzt nicht loslasse, sondern wieder in das bottom Border gehe, dann verkleinert sich das Fenster wieder wie es soll.

Jetzt meine Frage:
Gibt es eine Möglichkeit, während des drag Events dem BorderPane absoluten Fokus zu gewähren?

Ich habe schon probiert in der drag Methode root.requestFokus() aufzurufen, aber das funktioniert auch nicht (ich glaube, der Focus wird ganz am Anfang vom drag einmal requested und danach nicht mehr)

Danke schonmal im voraus

mirisbowring
 

dzim

Top Contributor
Du kannst in der Zeit ja die Events konsumieren und damit sollten sie nicht weiter-propagiert werden (event#consume()) - das machst du am Ende deiner Arbeit im Listener. Sonst mal ein kleines Beispiel posten - btw: Ich kämpfe auch gerade mit so etwas, aber ich benötige einen "lightweight" Dialog, der so etwas können muss - meine bisherige Variante ist leider zu "schwergewichtig" (render-Zeiten sind unterirdisch) und hat noch einen API-Call drin, der mit Java 9 wohl nicht mehr gehen wird (private API).
 

mirisbowring

Bekanntes Mitglied
Erst einmal danke, für deine Antwort. :)
leider hat das Konsumieren der events nichts verändert. (tritt halt wirklich nur bei sehr schnellen Vergrößerungen auf)
Trotzdem möchte ich dir meine Codeschnipsel nicht vorenthalten:
Java:
public static void resizeHelper(Node root, Stage stage){    
        Scene scene = stage.getScene();
        root.setOnMousePressed((MouseEvent event) -> {
            if (event.getX() > stage.getWidth() - 10
                    && event.getX() < stage.getWidth() + 10
                    && event.getY() > stage.getHeight() - 10
                    && event.getY() < stage.getHeight() + 10) {
                resizebottom = true;
                dx = stage.getWidth() - event.getX();
                dy = stage.getHeight() - event.getY();
            } else {
                resizebottom = false;
            }
        });

        root.setOnMouseMoved((MouseEvent event) -> {
            if(event.getSceneX() > scene.getWidth() - 10 && event.getSceneY() > scene.getHeight() - 10)
            {
                scene.setCursor(Cursor.SE_RESIZE);
            }else{
                scene.setCursor(Cursor.DEFAULT);
            }
        });

        root.setOnMouseDragged((MouseEvent event) -> {
            if (resizebottom == true) {
                double x = event.getX() + dx;
                double y = event.getY() + dy;
                if(x>MIN_WIDTH)
                    stage.setWidth(event.getX() + dx);              
                if(y>MIN_HEIGHT)
                    stage.setHeight(event.getY() + dy);
            }
        });
    }
das ist meine Resize Methode.
Ich übergebe das Element (in meinem Fall ein BorderPane) als root und die aktuelle Stage eben als Stage)...

Der code sollte relativ selbsterklärend sein... Wenn nicht, dann frag mich einfach nochmal^^
Auf jeden fall funktioniert das resizen bei mir schöner, als windows mit seinen eigenen fenstern (explorer, etc.)

Gruß
mirisbowring

PS:
Was ich noch anmerken muss ist, dass ich mein Fenster nur unten rechts in der Ecke vergrößern/verkleinern kann

Wenn du auch die anderen Seiten kannten haben willst, musst du die oberen beiden Action listsner anpassen :)
 
Zuletzt bearbeitet:

dzim

Top Contributor
Kannst du mir einen Gefallen tun und ein ganzes, selbständig laufendes, Beispiel geben? Ich möchte jetzt nicht drumherum irgendwas basteln...
 

mirisbowring

Bekanntes Mitglied
Also da ist nicht viel drum und dran:
Java:
package resizeexample;

import java.io.IOException;
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import static resizeexample.Main.StyleHelper.resizeHelper;

public class Main extends Application {
   
    private double xOffset = 0;
    private double yOffset = 0;
   
    @Override
    public void start(Stage stage) throws IOException {
        Label test = new Label();      
        test.setMinSize(200, 200);
        test.setText("Drag Me To Move");
        test.setAlignment(Pos.CENTER);
        test.setStyle("-fx-background-color: red;");
       
        BorderPane pane = new BorderPane();
        pane.setStyle("-fx-background-color: beige");
        pane.setMinSize(400, 400);
        pane.setPrefSize(500, 500);       
        pane.setCenter(test);
       
        //Listeners to move the undecorated Stage
        test.setOnMousePressed((MouseEvent e) -> {
            xOffset = e.getSceneX();
            yOffset = e.getSceneY();
        });
        test.setOnMouseDragged((MouseEvent e) -> {
            stage.setX(e.getScreenX()-xOffset);
           
            stage.setY(e.getScreenY()-yOffset);
        });
       
        Scene scene = new Scene(pane);
       
        stage.initStyle(StageStyle.UNDECORATED);
        stage.setScene(scene);
        stage.show();
       
        resizeHelper(pane, stage);
    }

    public static void main(String[] args) {
        launch(args);
    }
   
   
    public static class StyleHelper {
   
        public static final double MIN_WIDTH = 525.0;
        public static final double MIN_HEIGHT = 450.0;
        private static double dx;
        private static double dy;
        //resizeBottom is only needed if the Stage has a min Size
        private static Boolean resizebottom = false;

        /**
         *
         * @param root rootPane which has to be resized
         * @param stage current stage status
         */
        public static void resizeHelper(Node root, Stage stage){     
            Scene scene = stage.getScene();
            //Curser at "correct" position?
            //Change '10's to increse / decrease Action scope of Cursor
            root.setOnMousePressed((MouseEvent event) -> {
                if (event.getX() > stage.getWidth() - 10
                        && event.getX() < stage.getWidth() + 10
                        && event.getY() > stage.getHeight() - 10
                        && event.getY() < stage.getHeight() + 10) {
                    resizebottom = true;
                    dx = stage.getWidth() - event.getX();
                    dy = stage.getHeight() - event.getY();
                } else {
                    resizebottom = false;
                }
            });
            //Change Curser Style and Check which Border is hit
            root.setOnMouseMoved((MouseEvent event) -> {
                if(event.getSceneX() > scene.getWidth() - 10 && event.getSceneY() > scene.getHeight() - 10)
                {
                    scene.setCursor(Cursor.SE_RESIZE);
                }else{
                    scene.setCursor(Cursor.DEFAULT);
                }
            });
            //resize till min Size recognized
            root.setOnMouseDragged((MouseEvent event) -> {
                if (resizebottom == true) {
                    double x = event.getX() + dx;
                    double y = event.getY() + dy;
                    if(x>MIN_WIDTH)
                        stage.setWidth(event.getX() + dx);               
                    if(y>MIN_HEIGHT)
                        stage.setHeight(event.getY() + dy);
                }
            });
        }
    }
   
}
 

dzim

Top Contributor
Hm... Häh? Was ich witzig finde: Bei mir unter Linux kann ich die Fenster an jeder Ecke & Kante "resizen" auch wenn ich deinen StyleHelper auskommentiere...
Dein Problem kann ich jedoch nicht nachstellen. Hast du vielleicht eine langsame Graphikkarte?

BTW: Das einzige Problem das ich habe ist dass JavaFX-Anwendung bei mir meistens beim Vergrössern/-kleinern von Fenstern immer "Artefakte" aufweist - hässliche schwarze Bereiche, "Sprünge" beim Rendering, etc.
 

mirisbowring

Bekanntes Mitglied
Ok das ist interessant...
Vielleicht ist das ein Betriebssystem Spezifischer Fall (ich verwende Win10)
Heute Abend muss ich das mal auf Linux testen.

Also an der GPU kann es definitiv nicht liegen (R9 290).
Ich habe ja auch kein Renderproblem, sondern das Problem, dass das Root Pane irgendwie den Fokus verliert. (Auf Windows kann ich ja nur unten rechts die Größe verändern, und wenn ich dann zu schnell nach oben oder links ziehe - also verkleinere - bleibt das Root Pane auf einmal auf seiner Größe und verändert sich nicht mehr. Wenn ich dann mit der Maus wieder zur Ecke gehe - ohne die linke Maustaste los zulassen - verkleinert er sich wieder)

Diese "Artefakte" die du meinst treten bei mir auch in sehr geringem Maße auf. Erst war ich nicht sehr erfreut, aber als ich das ganze mit dem FileExplorer, Microsoft Edge, etc. von Windows 10 probiert habe, ist mir aufgefallen, dass es dort wesentlich stärker auftritt. Deshalb mache ich mir darum keine Gedanken :)
 

dzim

Top Contributor
Sag mir mal, wie es bei dir unter Linux ist. Ich muss erst mal schauen, dass ich einen Win10 Rechner dafür finde. :-D
 

mirisbowring

Bekanntes Mitglied
Also ich habe das mal auf meiner Kali Distro probiert, und ich konnte nur unten rechts vergößern/verkleinern... (Wenn ich den ResizeHelper abgeschaltet habe, gings gar nicht mehr)

Allerdings muss ich sagen, dass ich bei Kali fast gar keine "Fragmente" habe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JTree (absoluter Pfad) AWT, Swing, JavaFX & SWT 2
M KeyEvent ohne Fokus konsumieren AWT, Swing, JavaFX & SWT 1
H Swing Wie Fokus von JTextField entfernen? AWT, Swing, JavaFX & SWT 9
CptK Fokus auf geöffnetes Zweit-Fenster setzen und Eingaben außerhalb blocken AWT, Swing, JavaFX & SWT 2
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
P Fokus auf Zelle in JTable AWT, Swing, JavaFX & SWT 1
C SWT MenuBar & MenuItems Fokus wenn F10 unterdrücken/entfernen AWT, Swing, JavaFX & SWT 9
1 Swing Bestimme ob ein Subelement eines panel den Fokus verloren hat AWT, Swing, JavaFX & SWT 2
B Swing Fokus auf JPanel setzen AWT, Swing, JavaFX & SWT 2
J Swing Fokus JInternalFrame fehlerhaft AWT, Swing, JavaFX & SWT 4
B Fokus markierung entfernen AWT, Swing, JavaFX & SWT 2
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
A Vordergrund und Fokus setzten oder Modales Einabefeld AWT, Swing, JavaFX & SWT 28
G SWT Fokus auf MsgBox setzen AWT, Swing, JavaFX & SWT 3
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
A Fokus wieder in ein JTextField setzen AWT, Swing, JavaFX & SWT 4
N Filternde Combobox in JTable verliert Fokus nach erster Eingabe AWT, Swing, JavaFX & SWT 2
J Swing Wie Fokus richtig setzen? AWT, Swing, JavaFX & SWT 7
T Swing Fokus AWT, Swing, JavaFX & SWT 2
I Swing Wie bekomme ich den Fokus für einen JPanel AWT, Swing, JavaFX & SWT 5
H Swing Problem mit FocusCycleRoot, der FocusTraversalPolicy und dem Fokus AWT, Swing, JavaFX & SWT 2
G Problem beim setzen des Fokus AWT, Swing, JavaFX & SWT 4
E Swing Mit rechter Maustaste Fokus in JList setzen?! AWT, Swing, JavaFX & SWT 3
F Rechte Maustaste auf TreeNode soll den Fokus auf diese setzen AWT, Swing, JavaFX & SWT 6
agent47 Swing auf Schnelltaste ohne Fokus hören AWT, Swing, JavaFX & SWT 2
M JSpinner als TableCellEditor; buttons nur bei fokus sichtbar AWT, Swing, JavaFX & SWT 14
Z Fokus auf Eingabefeld bei showMessageDialog setzen AWT, Swing, JavaFX & SWT 3
N Herkunft des Fokus erkennbar (via Klick oder Tab-Steuerung)? AWT, Swing, JavaFX & SWT 4
F Panel kann nicht Fokus erhalten AWT, Swing, JavaFX & SWT 2
N Textfeld füllen sobald es den Fokus verliert AWT, Swing, JavaFX & SWT 2
D JTable, Model, Fokus AWT, Swing, JavaFX & SWT 3
multiholle AWT Hotkey ohne Fokus AWT, Swing, JavaFX & SWT 6
W JTextArea/TextArea kriegt keinen Fokus AWT, Swing, JavaFX & SWT 6
T Fokus auf CB in Table mit beliebiger Taste AWT, Swing, JavaFX & SWT 12
G JOptionPane.showInputDialog(): Texteingabe und Fokus AWT, Swing, JavaFX & SWT 3
V Kein Fokus für Key Bindings auf JPanel bzw JApplet AWT, Swing, JavaFX & SWT 2
R Fokus von GUI-Elementen AWT, Swing, JavaFX & SWT 3
F Herausfinden, auf welchem Objekt der Fokus liegt AWT, Swing, JavaFX & SWT 2
V JTable verliert Fokus, wie offene Zelle schliessen? AWT, Swing, JavaFX & SWT 5
S Eventhandling obwohl Fenster nicht im Fokus AWT, Swing, JavaFX & SWT 5
GilbertGrape bei "Enter" Funktion ausführen, egal wo der Fokus AWT, Swing, JavaFX & SWT 2
A Fokus in ein Textfeld setzen funktioniert nicht AWT, Swing, JavaFX & SWT 3
A ComboBox soll reagieren ohne fokus AWT, Swing, JavaFX & SWT 7
C Probleme einem JPanel den Fokus zuzuweisen AWT, Swing, JavaFX & SWT 2
A Fokus und JTextField AWT, Swing, JavaFX & SWT 35
T JList mit eigenem TransferHandler: Fokus(?)-Probleme AWT, Swing, JavaFX & SWT 4
D JButton mit Fokus soll auf ENTER reagieren AWT, Swing, JavaFX & SWT 3
M Frame erhält ungewollt den Fokus AWT, Swing, JavaFX & SWT 10
V JTable Handling Fokus on Keystroke und Maus Doubleclick AWT, Swing, JavaFX & SWT 9
S JTextArea mit Scrollbar,append Text mit Fokus? AWT, Swing, JavaFX & SWT 5
G Event, wenn JTextField Fokus verliert? AWT, Swing, JavaFX & SWT 2
C Der hartnäckige Fokus AWT, Swing, JavaFX & SWT 3
G Keylistener/Fokus Problem AWT, Swing, JavaFX & SWT 3
B Fokus Problem unter Linux AWT, Swing, JavaFX & SWT 7
J JFrame und Fokus AWT, Swing, JavaFX & SWT 4
N Fokus Reihenfolge ändern AWT, Swing, JavaFX & SWT 12
M Fokus auf ein JTextfield in einem JDialog setzen AWT, Swing, JavaFX & SWT 6
I fokus AWT, Swing, JavaFX & SWT 4
H JItem während der Programmlaufzeit verändern AWT, Swing, JavaFX & SWT 8
G JavaFX BarChart während der Runtime aktualisieren AWT, Swing, JavaFX & SWT 4
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
S JavaFX ListView Inhalte während Laufzeit ändern AWT, Swing, JavaFX & SWT 23
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
B 3D-Grafik Java 3D Licht während Laufzeit ändern AWT, Swing, JavaFX & SWT 0
Joew0815 Dropdown meue während der Laufzeit ändern. AWT, Swing, JavaFX & SWT 6
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
B ProgressBar während Berechnung AWT, Swing, JavaFX & SWT 4
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
M JLabel aktualsisieren während Verarbeitung AWT, Swing, JavaFX & SWT 12
E Buttons während einer Berechnung deaktivieren AWT, Swing, JavaFX & SWT 6
D JTable Mausevents, während editiert wird AWT, Swing, JavaFX & SWT 5
T Swing JFrame blockieren während anderes JFrame offen ist AWT, Swing, JavaFX & SWT 2
R Wie Vorgehen bei fundamentaler Veränderung des Layouts während des Programmablaufs? AWT, Swing, JavaFX & SWT 19
S Programm pausieren während JDialog offen ist AWT, Swing, JavaFX & SWT 2
X Tabelle während Funktionsaufruf aktualisieren AWT, Swing, JavaFX & SWT 11
S Swing JTextArea während der Laufzeit füllen AWT, Swing, JavaFX & SWT 5
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
R GUI hängt während Programm läuft AWT, Swing, JavaFX & SWT 7
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
S Swing Während Frame verschoben wird... AWT, Swing, JavaFX & SWT 2
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
T Swing Dialoginhalt automatisch anpassen während Größenänderung AWT, Swing, JavaFX & SWT 2
D Swing Anzeige während eines Ladevorganges AWT, Swing, JavaFX & SWT 6
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
M SWT Mutter-Shell blocken während Tochter-Shell noch offen ist AWT, Swing, JavaFX & SWT 6
S Swing DnD: Image während Drag-Operation ändern AWT, Swing, JavaFX & SWT 3
M Swing JTable während Laufzeit beschreiben AWT, Swing, JavaFX & SWT 14
S Objekt wird während Endlosschleife nur einmal bewegt AWT, Swing, JavaFX & SWT 2
O Zeichnene auf ein Jpanel während der Laufzeit des Programms AWT, Swing, JavaFX & SWT 2
J GUI (JTable) während Rekursion aktualisieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben