2016-03-10 6 views
1

Итак, у меня есть класс, который рисует гистограмму. Я получил код здесь:Вызвать класс, который расширяет другой класс из основного метода

https://docs.oracle.com/javafx/2/charts/bar-chart.htm

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.chart.BarChart; 
import javafx.scene.chart.CategoryAxis; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.stage.Stage; 

public class BarChartSample extends Application { 
final static String austria = "Austria"; 
final static String brazil = "Brazil"; 
final static String france = "France"; 
final static String italy = "Italy"; 
final static String usa = "USA"; 

@Override public void start(Stage stage) { 
    stage.setTitle("Bar Chart Sample"); 
    final CategoryAxis xAxis = new CategoryAxis(); 
    final NumberAxis yAxis = new NumberAxis(); 
    final BarChart<String,Number> bc = 
     new BarChart<String,Number>(xAxis,yAxis); 
    bc.setTitle("Country Summary"); 
    xAxis.setLabel("Country");  
    yAxis.setLabel("Value"); 

    XYChart.Series series1 = new XYChart.Series(); 
    series1.setName("2003");  
    series1.getData().add(new XYChart.Data(austria, 25601.34)); 
    series1.getData().add(new XYChart.Data(brazil, 20148.82)); 
    series1.getData().add(new XYChart.Data(france, 10000)); 
    series1.getData().add(new XYChart.Data(italy, 35407.15)); 
    series1.getData().add(new XYChart.Data(usa, 12000));  

    XYChart.Series series2 = new XYChart.Series(); 
    series2.setName("2004"); 
    series2.getData().add(new XYChart.Data(austria, 57401.85)); 
    series2.getData().add(new XYChart.Data(brazil, 41941.19)); 
    series2.getData().add(new XYChart.Data(france, 45263.37)); 
    series2.getData().add(new XYChart.Data(italy, 117320.16)); 
    series2.getData().add(new XYChart.Data(usa, 14845.27)); 

    XYChart.Series series3 = new XYChart.Series(); 
    series3.setName("2005"); 
    series3.getData().add(new XYChart.Data(austria, 45000.65)); 
    series3.getData().add(new XYChart.Data(brazil, 44835.76)); 
    series3.getData().add(new XYChart.Data(france, 18722.18)); 
    series3.getData().add(new XYChart.Data(italy, 17557.31)); 
    series3.getData().add(new XYChart.Data(usa, 92633.68)); 

    Scene scene = new Scene(bc,800,600); 
    bc.getData().addAll(series1, series2, series3); 
    stage.setScene(scene); 
    stage.show(); 
} 

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

}

Но проблема в том, я хочу назвать этот класс BarChartSample от моего основного метода в другом классе. Например, у меня есть класс BookRecommender и имеет основной метод. Я хочу иметь возможность устанавливать такие параметры, как title, xlabel, ylabel, а также значения этого класса BarChartSample. Но я не могу запустить метод start класса BarChartSample из моего класса Recommendedender.

+0

Можете ли вы изменить класс BarChartSample или он останется в его нынешнем виде? – Draken

+0

Вы можете изменить, как считаете лучше. Я просто хочу, чтобы функциональность гистограммы рисовала диаграмму для меня. – HimanAB

+1

ОК, похоже, что вы хотите, чтобы кто-то другой выполнял эту работу за вас. На самом деле это не переполнение стека. Попробуйте сделать класс, основанный на этом примере, самостоятельно, и если у вас возникнут проблемы с указанным классом, не стесняйтесь задавать другой вопрос: – Draken

ответ

3

Это приложение JavaFX, поэтому вы не вызываете этот класс из другого класса напрямую. Вам необходимо инкапсулировать функциональность этого класса в класс, а затем вызвать его из приложения JavaFX.

E.g. вы можете подклассировать сцену, чтобы создать конкретный BarChartScene, а затем передать данные, которые вам нужны, в конструкторе или методе setData ([данные, которые вы хотите передать]). Или вы можете создать класс BarChartSceneFactory, который вернет объект Scene.

E.g. SceneFactory.java

import javafx.scene.Scene; 
import javafx.scene.chart.BarChart; 
import javafx.scene.chart.CategoryAxis; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 

public abstract class SceneFactory { 
    private static final String AUSTRIA = "Austria"; 
    private static final String BRAZIL = "Brazil"; 
    private static final String FRANCE = "France"; 
    private static final String ITALY = "Italy"; 
    private static final String USA = "USA"; 

    public static Scene getBarChartScene() { 
     final CategoryAxis xAxis = new CategoryAxis(); 
     final NumberAxis yAxis = new NumberAxis(); 
     final BarChart<String,Number> bc = new BarChart<String,Number>(xAxis,yAxis); 
     bc.setTitle("Country Summary"); 
     xAxis.setLabel("Country");  
     yAxis.setLabel("Value"); 

     XYChart.Series series1 = new XYChart.Series(); 
     series1.setName("2003");  
     series1.getData().add(new XYChart.Data(AUSTRIA, 25601.34)); 
     series1.getData().add(new XYChart.Data(BRAZIL, 20148.82)); 
     series1.getData().add(new XYChart.Data(FRANCE, 10000)); 
     series1.getData().add(new XYChart.Data(ITALY, 35407.15)); 
     series1.getData().add(new XYChart.Data(USA, 12000));  

     XYChart.Series series2 = new XYChart.Series(); 
     series2.setName("2004"); 
     series2.getData().add(new XYChart.Data(AUSTRIA, 57401.85)); 
     series2.getData().add(new XYChart.Data(BRAZIL, 41941.19)); 
     series2.getData().add(new XYChart.Data(FRANCE, 45263.37)); 
     series2.getData().add(new XYChart.Data(ITALY, 117320.16)); 
     series2.getData().add(new XYChart.Data(USA, 14845.27)); 

     XYChart.Series series3 = new XYChart.Series(); 
     series3.setName("2005"); 
     series3.getData().add(new XYChart.Data(AUSTRIA, 45000.65)); 
     series3.getData().add(new XYChart.Data(BRAZIL, 44835.76)); 
     series3.getData().add(new XYChart.Data(FRANCE, 18722.18)); 
     series3.getData().add(new XYChart.Data(ITALY, 17557.31)); 
     series3.getData().add(new XYChart.Data(USA, 92633.68)); 

     Scene scene = new Scene(bc,800,600); 
     bc.getData().addAll(series1, series2, series3); 
     return scene; 
    } 
} 

MainApp.java

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class MainApp extends Application { 
    @Override 
    public void start(Stage stage) { 
     Scene scene = SceneFactory.getBarChartScene(); 
     stage.setScene(scene); 
     stage.setTitle("Bar Chart Sample"); 
     stage.show(); 
    } 
} 

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

Если вы хотите, чтобы ваши собственные пользовательские данные отображались, передайте их методу getScene в качестве параметра, например. Map<Integer, Map<String, Double>> chartData, где первое целое число содержит год, который сопоставляется с отображением имени страны в значения.

Или вы можете подклассировать сцену и сделать это так же, например.

public class BarChartScene extends Scene { 
    public BarChartScene([pass some data in here]) { 
     // Build your scene based on the data passed in the constructor. 
    } 
} 
+0

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

+1

Да, вы МОЖЕТЕ это сделать, но сначала вам нужно воспользоваться функциональностью OUT этого приложения JavaFX, затем позвоните ему из другого. – ManoDestra

+1

Это так, вам просто нужно реорганизовать пример кода в такой класс. – Draken

1

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

+0

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

+0

Проблема заключается в том, что я хочу использовать этот класс диаграммы в моем основном методе после того, как я вычислил некоторые значения, а затем передаю эти значения классу Chart, чтобы нарисовать гистограмму. Я не хочу, чтобы класс диаграммы был автоматически вызван, когда я запускаю свою программу. – HimanAB

+0

Затем сделайте то, что я сказал вам выше, и все будет работать нормально. – ManoDestra