2016-12-20 4 views
0

У меня есть 3 класса, с которыми я сейчас работаю: ButtonMove.java, MainController.java и Main.fxml. Я экспериментировал с SceneBuilder для создания пользовательских интерфейсов и хотел добавить движение к объекту. Я попытался заставить эту кнопку двигаться, но безрезультатно. Сцена запускается, и я вижу кнопку, но она остается неподвижной.Почему мой класс контроллера fxml не перемещает мою кнопку?

package TestClasses; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class ButtonMove extends Application 
{ 

    @Override 
    public void start(Stage stage) throws Exception { 
     // TODO Auto-generated method stub 
     Parent root = FXMLLoader.load(getClass().getResource("Main.fxml")); 

     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
    } 


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

    } 


} 

выше класс, ButtonMove.java, просто загружает файл FXML, Main.fxml, и запускает на сцену. Ниже находится файл контроллера Main.fxml, который почему-то продолжает говорить мне, что javafx.fxml.FXML никогда не используется.

package TestClasses; 

import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.animation.TranslateTransition; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.util.Duration; 

public class MainController implements Initializable 
{ 

    private Button button; 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     // TODO Auto-generated method stub 
     TranslateTransition transition = new TranslateTransition(); 
     transition.setDuration(Duration.seconds(4)); 
     transition.setNode(button); 
     transition.setToY(-200); 
     transition.play(); 
    } 

} 

И это всего лишь файл fxml, созданный SceneBuilder.

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.layout.StackPane?> 

<StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <AnchorPane prefHeight="200.0" prefWidth="200.0"> 
     <children> 
      <Button id="button" layoutX="274.0" layoutY="310.0" mnemonicParsing="false" text="CLICK" /> 
     </children> 
     </AnchorPane> 
    </children> 
</StackPane> 

ответ

0

добавить FXML тег здесь:

@FXML 
private Button button; 

иначе кнопка не инициализирована.

1

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

Это потому, что вы не используете аннотацию @FXML в любом месте кода.

Для подключения FXML к контроллеру, необходимо

  1. Сделать поле, которое должно быть впрыскивается виден FXMLLoader по аннотирования его:

    @FXML 
    private Button button; 
    
  2. Укажите класс контроллера для используется с fxml путем добавления атрибута fx:controller к корневому элементу:

    <StackPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="TestClasses.MainController"> 
    

    или указав экземпляр контроллера перед вызовом FXMLLoader.load

    FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml")); 
    loader.setController(new MainController()); 
    Parent root = loader.load(); 
    
  3. Укажите атрибут fx:id для объектов, которые вы хотите, чтобы ввести в контроллер:

    <Button fx:id="button" layoutX="274.0" layoutY="310.0" mnemonicParsing="false" text="CLICK" /> 
    
+0

спасибо за это. Я заработал. Я очень новичок в javaFX, и я все еще изучаю синтаксис. Ваши объяснения были четкими, лаконичными и хорошо организованными. – JLH

Смежные вопросы