«Тип должен реализовывать унаследованный абстрактный метод Application.start (Stage)», в то время как метод включен и переопределен - PullRequest
0 голосов
/ 08 февраля 2019

Java FX noob, но я перепробовал все, что знаю и могу найти у других в сети.Я проверил JVM на версии 1.8 и очистил / перестроил весь пакет.

Попытка создать программу, отображающую 3 объекта один за другим, навсегда на пустом фоне, до сбоя / закрытия программыв классе под названием Painter.Он вызывается / управляется классом Controller в том же пакете.

Методы в Painter - это start (), run () и main (), первые два имеют ошибки, а также само объявление класса.

Объявление класса имеет погрешность заголовка.run () переопределяется, но все еще имеет жалобу "должен переопределить или наследовать метод супертипа".start () имеет несколько ошибок.Я пытался заставить его реализовать приложение напрямую, но он все еще жалуется на это.

package anonAssignment2; //@author anon, course#

import javafx.scene.canvas.GraphicsContext;                 
import javafx.scene.*;
import javafx.scene.paint.*;                      
import javafx.scene.canvas.*;                     
import javafx.scene.canvas.Canvas;


import javafx.application.Application;              
import javafx.scene.Scene;                      
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.scene.text.*;
import javafx.scene.paint.Color;
import javafx.event.EventHandler;
import javafx.event.ActionEvent;
import javafx.animation.KeyFrame;                        
//Handles animation timing
import javafx.util.Duration;

import java.util.Timer;     // ->
import java.lang.*;         //Thread.sleep(int milliseconds)


/* 
 * Painter- handles shape drawing
 * Extends application to be within spec, called by controller
 * Implements EventHandler for 3000ms changing of shape
 */

public class Painter extends Application {

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


    Painter painter = new Painter();

    Pane pane = new Pane();

    private Canvas canvas = new Canvas(300, 300);

    GraphicsContext gc = canvas.getGraphicsContext2D();



    /** Method to start continuously displaying GUI shapes/objects
     * 
     */
    @Override
    public void run() { 
    while(true) {                            
 //Always true, runs until program killed/crashes

        gc.setStroke(Color.RED);
        gc.strokeOval(150, 150, 100, 100);  //circle
        java.lang.Thread.sleep(3000);

        gc.clearRect(100, 100, 100, 100);   //For purposes of this program, blank background, clearing rectangle works

        gc.setStroke(Color.GREEN);
        gc.strokeRect(100, 100, 100, 100);  //Square
        java.lang.Thread.sleep(3000);

        gc.clearRect(100, 100, 100, 100);

        gc.setStroke(Color.BLUE);
        gc.strokeText("Course # and Title", 100, 140);  //Text, approximately centered
        java.lang.Thread.sleep(3000);

        gc.clearRect(100, 100, 100, 100);

        }

        }

    /**Start command, uses primaryStage instance 
     * Called by Controller
     * 
     */


    @Override
    public void start(Stage primaryStage) implements Application throws Exception {
    Pane pane = new Pane();

    pane.setPrefWidth(300);
        pane.setPrefHeight(300);
        Scene scene = new Scene(pane);
        primaryStage.setTitle("Rheault Project 2");
        primaryStage.setScene(scene);
        primaryStage.show();

        Controller instance = new Controller(painter);               
        //Controller constructor with argument of painter instance
    }

}

//controller.java class:

//@author anon, course #
package anonAssignment2;


public class Controller extends Thread {
    private Painter painter;
    public Controller(Painter painter) {
        this.painter = painter;
        Painter.start();
        }

    public void run() {
        while (true) {
            painter.paint();
            try {
                Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    }
            }
        }
    }

'' ''

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Похоже, это задание, поэтому я не знаю, что нужно, а что нет.Если вам не нужны Threads, не используйте их.Если вы можете использовать Timeline, я бы рекомендовал использовать его.Это примерное приложение, скорее всего, не делает то, что вам нужно, но, надеюсь, оно поможет.

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication335 extends Application
{

    @Override
    public void start(Stage primaryStage)
    {
        Canvas canvas = new Canvas(300, 300);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(3), (ActionEvent event1) -> {
            gc.setStroke(Color.RED);
            gc.strokeOval(150, 150, 100, 100);  //circle
            System.out.println("running 1");
        }), new KeyFrame(Duration.seconds(6), (ActionEvent event1) -> {
            gc.clearRect(100, 100, 100, 100);   //For purposes of this program, blank background, clearing rectangle works
            gc.setStroke(Color.GREEN);
            gc.strokeRect(100, 100, 100, 100);  //Square
            System.out.println("running 2");
            //java.lang.Thread.sleep(3000);
        }), new KeyFrame(Duration.seconds(9), (ActionEvent event1) -> {
            gc.clearRect(100, 100, 100, 100);
            gc.setStroke(Color.BLUE);
            gc.strokeText("Course # and Title", 100, 140);  //Text, approximately centered
            System.out.println("running 3");
            //java.lang.Thread.sleep(3000);
        }), new KeyFrame(Duration.seconds(12), (ActionEvent event1) -> {
            gc.clearRect(100, 100, 100, 100);
            System.out.println("running 4");
        }));
        timeline.setCycleCount(Timeline.INDEFINITE);

        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            timeline.play();
        });

        StackPane root = new StackPane();
        root.getChildren().add(new VBox(canvas, btn));

        Scene scene = new Scene(root, 500, 500);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}
0 голосов
/ 08 февраля 2019

Прежде всего, копируя ваш код в IDE, кажется, что вы пытаетесь запустить приложение из основного внутри ... приложения?Вот так:

  public class Painter extends javafx.application.Application {

   public static void main(String[] args) {
       javafx.application.Application.launch(args);
   }

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

Затем я немного посмотрел на ваш код:

Изменение такого метода запуска, как это, дает мнепо крайней мере, никаких ошибок в IDE:

@Override
public void start(javafx.stage.Stage primaryStage) throws Exception {
    javafx.scene.layout.Pane pane = new javafx.scene.layout.Pane();

    pane.setPrefWidth(300);
    pane.setPrefHeight(300);
    javafx.scene.Scene scene = new javafx.scene.Scene(pane);
    primaryStage.setTitle("Rheault Project 2");
    primaryStage.setScene(scene);
    primaryStage.show();

    Controller instance = new Controller(painter);
    //Controller constructor with argument of painter instance
}

Я пропустил часть Implements, так как уже ясно, что вы переопределяете метод суперкласса, вы даже можете щелкнуть по нему в вашей IDE, и он перейдет к методу суперкласса., чтобы подтвердить это.

Наконец, я также посмотрел на метод запуска.Он ничего не перезаписывает, поскольку не существует в приложении суперкласса.Попробуйте щелкнуть по нему, и вы увидите.

public void run

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...