Почему компилятор показывает ошибку при импорте javafx.scene.control.Label? - PullRequest
0 голосов
/ 01 августа 2020

Я изучаю javafx и пытаюсь создать ярлык. Но при импорте javafx.scene.control.Label я получаю сообщение об ошибке: The import javafx.scene.control.Label conflicts with a type defined in the same file

Весь код:

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;

public class Label extends Application {
    public void start(Stage primaryStage) {
        Label label = new Label("This is a label");
        StackPane root = new StackPane();
        Scene scene = new Scene(root, 600, 400);
        root.getChildren().add(label);
        primaryStage.setScene(scene);
        primaryStage.show();
        
        
    }
    public static void main(String args[]) {
        launch(args);
    }
}

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Это связано с тем, что основной поток ищет предопределенный аргумент класса Label. Но здесь у него есть метод запуска () с определяемым пользователем классом Label. Всякий раз, когда основной поток видит имя класса, он пытается выполнить поиск в области видимости этого класса. Сначала он будет отображаться в вашей программе, затем в вашем пакете. Если он не найден, JVM следует принципу иерархии делегирования для загрузки этого класса. Следовательно, вы получите ошибку времени выполнения.

Чтобы запустить указанную выше программу, мы можем также укажите полный путь к классу Label, т.е. javafx.scene.control.Label label = new javafx.scene.control.Label("This is a label");.

заключение - пожалуйста, измените имя вашего класса, вы можете использовать вышеуказанное решение, но оно становится беспорядочным.

0 голосов
/ 01 августа 2020

Имена типов в рамках класса должны быть уникальными. Вы определяете новый класс с именем Label при импорте другого класса, который также называется Label. Поэтому, если вы напишите в коде Label, компилятор не знает, какой класс использовать.

Вы можете либо переименовать свой класс (чтобы он не конфликтовал), либо не импортировать другой класс. Обратите внимание, что даже без импорта

javafx.scene.control.Label label = new javafx.scene.control.Label();

будет работать, но это довольно некрасиво.

РЕДАКТИРОВАТЬ: по мере расширения вашего класса Application вы, вероятно, захотите переименовать его в somithing, например LabelApp или что-то еще, что делает приложение

...