Alle meine JavaFX TextFields enthalten Linien

72

Wenn ich mir in JavaFX die Zähne schneide, laufen die Dinge bisher gut.

In allen Textfeldern verläuft jedoch eine Linie, etwa 10 Pixel von oben.

Nicht nur in meiner Anwendung, sondern auch in der SceneBuilder-Anwendung.

Hinweis: Ich verwende kein explizites CSS. Ich weiß nicht, was SceneBuilder verwendet. Der Screenshot stammt von SceneBuilder, meine Bildschirme sehen identisch aus.

JavaFX TextFields

Es ist also etwas Grundlegendes.

java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

Unter Mac OS 10.9.5

Nur neugierig, ob jemand dies gesehen hat und einen Vorschlag hat.

Bearbeiten: Ich habe die Beispiele heruntergeladen, es hat eindeutig etwas mit dem Modena-Thema zu tun. Das kaspische Thema sieht gut aus. Unten sehen Sie einen Screenshot aus dem Abschnitt Modena.jar TextFields. Es ist interessant, dass der TextAreaein ähnliches Problem hat, wenn auch nicht so allgemein wie der TextField.

Modena.jar Screenshot

Weitere Ergänzungen:

Die Leute verlangen immer wieder danach, also hier ist es. Ich habe im Wesentlichen nur Folgendes befolgt: https://docs.oracle.com/javafx/2/get_started/form.htm und ein Standard-JavaFX-Anwendungsprojekt von Netbeans 8.0.2 verwendet. Einfach ausschneiden und von der Website einfügen.

public class Fxlinetest extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX Welcome");

        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));

        Text scenetitle = new Text("Welcome");
        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        grid.add(scenetitle, 0, 0, 2, 1);

        Label userName = new Label("User Name:");
        grid.add(userName, 0, 1);

        TextField userTextField = new TextField();
        grid.add(userTextField, 1, 1);

        Label pw = new Label("Password:");
        grid.add(pw, 0, 2);

        PasswordField pwBox = new PasswordField();
        grid.add(pwBox, 1, 2);

        Button btn = new Button("Sign in");
        HBox hbBtn = new HBox(10);
        hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
        hbBtn.getChildren().add(btn);
        grid.add(hbBtn, 1, 4);

        final Text actiontarget = new Text();
        grid.add(actiontarget, 1, 6);

        Scene scene = new Scene(grid, 300, 275);
        primaryStage.setScene(scene);

        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Beispielformular Screenshot

java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

Hier ist ein Screenshot der ThreeDOM-Ansicht aus ScenicView 8.6. Beachten Sie die folgende Zeile: ThreeDOM-Ansicht von ScenicView - beachten Sie die Linie

java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)

Hier ist der Beispielbildschirm mit dem kaspischen Thema über:

    System.setProperty("javafx.userAgentStylesheetUrl", "caspian");

Kaspische Themenansicht

Will Hartung
quelle
2
Interessantes CSS?
Evan Knowles
1
Sieht aus irgendeinem Grund so aus, als wäre die Aufstiegslinie gezogen. Seltsam.
isnot2bad
3
Wie sieht es aus, wenn Sie die Samples herunterladen und das Javafx-Ensemble starten ?
Roland
1
Okay, das ist wirklich seltsam. Wie haben Sie Ihre Anwendung eingerichtet? Ist etwas explizit geregelt?
Marcel
6
Vielleicht könnten Sie mehr Code bereitstellen? Also können wir es uns ansehen ... (oder versuchen, das Problem auf eigenen Maschinen zu reproduzieren)
rzo

Antworten:

7

Dies ist ein bekannter ungelöster Fehler .

Das Problem scheint zu sein, dass es für die Entwickler nicht reproduzierbar ist.

In den Kommentaren des Fehlerberichts wird die Verwendung eines JVM-Parameters empfohlen:

-Dprism.disableRegionCaching=true

Wenn jedoch jemand diesen sehr seltenen Fehler reproduzieren kann, ist mein Vorschlag:

  • Ändern Sie die Modena CSS-Datei, bis der Fehler behoben ist, und geben Sie diese Informationen weiter. es kann helfen, da Kaspisch zu funktionieren scheint.
  • Debuggen Sie bei Bedarf in der Javafx-Quelle, um das Problem zu isolieren. Das Problem könnte jedoch tiefer gehen, aber es ist einen Versuch wert
Roland
quelle
1

Emm ... Ich bin nicht 100% sicher, weil ich die Auswirkungen auf mein JVM nicht habe, obwohl ich eine Linux-Plattform habe. Trotzdem habe ich versucht zu emulieren (? Ich bin mir nicht sicher, ob es mir ziemlich gut gelungen ist), aber ich denke, das von Ihnen beschriebene Problem könnte wirklich damit zusammenhängen

  • a) Schriftart
  • b) Problem neu streichen

Den von Ihnen dargestellten Code habe ich ein wenig geändert, um zu zeigen, was mit Gridpanel-Linien passiert, wenn sich Komponenten in "irgendeiner" Reihenfolge befinden.

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;


public class BlackLineIssueJavaFXApplication1 extends Application {



    @Override
    public void start(Stage primaryStage) {

        System.setProperty("javafx.userAgentStylesheetUrl", "Modena");
        //Modena,caspian
        primaryStage.setTitle("JavaFX Welcome");

        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));
//        grid.setGridLinesVisible(false);//<---

        Text scenetitle = new Text("Welcome");//original
//        Label scenetitle = new Label("Welcome");//modified
        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));//original
//        scenetitle.setFont(Font.font("Verdana", FontWeight.LIGHT, 30));//modified
        grid.add(scenetitle, 0, 0, 2, 1);//original
//        grid.add(scenetitle, 0, 0);//modified


        Label userName = new Label("User Name:");//original
//        Text userName = new Text("User Name:");
//        userName.setFont(Font.font("Tahoma", FontWeight.NORMAL, 11));

//        grid.add(userName, 0, 1);//original
        grid.add(userName, 0, 1,1,2);//modified


        grid.setGridLinesVisible(true);//<---

        TextField userTextField = new TextField();  
//        userTextField.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));//modified
        userTextField.setOpacity(0.5);//<----

//        grid.add(userTextField, 1, 1);//original
        grid.add(userTextField, 1, 1,1,2);//modified

        grid.setGridLinesVisible(false);//<---



        Button btn = new Button("Sign in");
        HBox hbBtn = new HBox(10);

        hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
        hbBtn.getChildren().add(btn);
        grid.add(hbBtn, 1, 4);//original
        //grid.add(hbBtn, 1, 3);//modified

        final Text actiontarget = new Text();
        grid.add(actiontarget, 1, 6);

        Scene scene = new Scene(grid, 300, 275);
        primaryStage.setScene(scene);

        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

Die laufende App sieht so aus:

Bild A:

Geben Sie hier die Bildbeschreibung ein

... so erscheint die schwarze Linie im Textfeld in einer Entfernung von ungefähr 10 Pixel, möglicherweise nur, weil die Vgap auf 10 gesetzt ist; Beachten Sie außerdem, dass der "Willkommenstext" gekreuzt ist, jedoch vertikale Linien aufweist. Getestet habe ich , wenn „nicht Schriftart zu verwenden“ für scenetitle es richtig (siehe Bild) befindet;

Bild B.

Geben Sie hier die Bildbeschreibung ein

Also stimmt vielleicht etwas mit GridPane nicht; Möglicherweise hat das Standard-GridPane "Linien sichtbar" oder so, aber nachdem Komponenten die Zeilen "entsorgt" hinzugefügt haben, aber wegen TextField, das "Text" mit "Schriftart" enthalten sollte (siehe Bild Ein vertikaler Linienkreuztext wegen der Schriftart ), wird das Repaint nicht ausgeführt funktioniert nicht richtig und Sie können die schwarze Linie oben sehen, wie Bild A zeigt; Ich kann den Effekt nicht vollständig emulieren, aber ich kann trotzdem vorschlagen, woher die "nicht entsorgte" Linie kommt oder so :)

Ich werde trotzdem versuchen, ein bisschen weiter zu analysieren. Die Informationen, die ich in dieser Antwort beschreibe, können Ihnen helfen, herauszufinden, wo Sie mit dem Debuggen beginnen können.

Wenn Sie zusätzliche Informationen benötigen, lassen Sie es mich bitte wissen.

Viel Glück :)

Toolkit, das ich zum Testen verwendet habe:

  • jdk-1.0.8_25
  • jre-1.8.0_60 (Linux x64)
  • ide: netbeans 8.0.1
user390525
quelle