Все мои текстовые поля JavaFX имеют в них строки
Итак, режу зубы на JavaFX, пока все идет хорошо.
Однако все текстовые поля имеют строку, проходящую через них, 10 пикселей или около того сверху.
Не только в моем приложении, но и в приложении SceneBuilder.
Заметьте, я не использую явный CSS, я не знаю, что использует SceneBuilder. Экран снят с SceneBuilder, мои экраны выглядят одинаково.
![JavaFX TextFields]()
Итак, это что-то фундаментальное.
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)
В Mac OS 10.9.5
Просто интересно, если кто-то еще это видел и имеет предложение.
Изменить: я загрузил образцы, это явно что-то связано с темой Модены. Каспийская тема выглядит просто замечательно. Ниже приведен снимок экрана из раздела Modene.jar TextFields. Интересно, что TextArea
испытывает аналогичную проблему, хотя и не так универсально, как TextField
.
![Modena.jar screenshot]()
Дополнительные добавления:
Люди продолжают настаивать на этом, так что вот оно. Я по существу просто придерживался этого: https://docs.oracle.com/javafx/2/get_started/form.htm и использовал проект приложения NetBeans 8.0.2 JavaFX по умолчанию. Просто вырезать и вставить его с сайта.
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);
}
}
![Пример скриншота формы]()
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)
Вот скриншот из представления ThreeDOM от ScenicView 8.6, обратите внимание на строку:
![Просмотр с трех точек зрения из ScenicView - обратите внимание на строку]()
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)
Здесь образец экрана с использованием каспийской темы через:
System.setProperty("javafx.userAgentStylesheetUrl", "caspian");
![Каспийский вид темы]()
Ответы
Ответ 1
Это известная неразрешенная ошибка.
Проблема заключается в том, что она не воспроизводится разработчиками.
В комментариях отчета об ошибке предлагается использовать параметр jvm:
-Dprism.disableRegionCaching=true
Однако, если кто-то может воспроизвести эту очень редкую ошибку, мое предложение:
- измените файл modena css до тех пор, пока ошибка не будет решена и не будет делиться этой информацией. это может помочь, поскольку каспийский, похоже, работает.
- при необходимости отлаживать источник javafx, чтобы изолировать проблему. однако проблема может быть более глубокой, но стоит сделать
Ответ 2
Эмм... Я не уверен на 100%, потому что я не влияю на мой jvm, хотя у меня есть платформа Linux; Но все же я пытался подражать ("не уверен, что я преуспел очень хорошо), так или иначе, я думаю, что проблема, которую вы описываете, может быть действительно связана с
- a) шрифт
- b) перерисовать проблему
Представленный вами код меня немного изменил, чтобы показать, что происходит с сетчатыми линиями, если компоненты находятся в "некотором" порядке;
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);
}
}
Запуск приложения выглядит следующим образом:
Изображение A:
![введите описание изображения здесь]()
... поэтому черная строка появляется в текстовом поле на расстоянии около 10 пикселей, возможно, только потому, что Vgap установлен на 10; Более того, см. Текст "приветствия" скрещен, но с вертикальными линиями; Я тестировал, если "не использовать шрифт" для scenetitle, он правильно расположен (см. Изображение);
Изображение B
![введите описание изображения здесь]()
Так что, возможно, что-то не так с GridPane. Может быть, по умолчанию GridPane имеет "видимые строки" или что-то, но после того, как компоненты добавили строки "disposed", но из-за TextField, который должен содержать "текст" с "шрифтом" (см. Изображение. Вертикальные линии пересекают текст из-за шрифта), repaint doesn 't работаем правильно, и вы можете видеть черную линию наверху, как показывает изображение A; Я не могу полностью эмулировать эффект, но все же могу предложить, где может возникнуть "непривязанная" линия или что-то подобное.
Я попытаюсь проанализировать немного дальше, так как информация, которую я описываю в этом ответе, может помочь вам найти, с чего начать отладку;
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать;
Удачи:)
Инструмент который я использовал для тестирования:
- JDK 1.0.8_25-
- jre-1.8.0_60 (Linux x64)
- ide: netbeans 8.0.1