2015-10-18 4 views
0

Я пытаюсь разработать проект javafx таким образом, чтобы бизнес-логика и представление были разделены. Честно говоря, я не знаю, понял ли я это правильно.изменить атрибуты объекта javafx

Моя идея состояла в том, чтобы создать представление класса. Упрощенное это выглядит следующим образом:

public class View extends Application { 

    private Pane screen = new Pane(); 

    private Rectangle rect; 

    private Scene scene = new Scene(screen, 500, 500); 


    public View(){ 
     rect = new Rectangle(10, 10, 100, 100); 
     rect.setFill(Color.WHITE); 
     rect.setStroke(Color.BLACK); 
     screen.getChildren().add(rect); 
    } 

    @Override 
    public void start(Stage primaryStage) { 

     primaryStage.setTitle("Rectangles"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

    } 

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

    public void setColor() { 
     rect.setFill(Color.BROWN); 
    } 

} 

Объекты этого класса могут создаваться и использоваться таким образом, в основном методе другого класса, включая BUSSINESS логику:

View foo = new View(); 
foo.main(null); 

К сожалению, я не могу затем измените его атрибуты. Поэтому это утверждение не имеет никакого эффекта.

foo.setColor(); 

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

+0

Вы говорите, что хотите отделить представление и логику, но у вас есть только один класс здесь. Если вы продляете приложение, этот класс будет вашим Main.class, и ваше приложение начнет с него. Вы не создаете экземпляр из любого другого класса! Где ваша логическая часть? – Tobi

+0

Извините, я пропустил всю логическую часть. Заявления под классом должны выполняться в основном методе другого класса (этот класс включает в себя логику бизнеса, которая не имеет к ней отношения). – user3803086

+0

Есть ли у вашего логического класса также основной метод? – Tobi

ответ

1

Вам необходимо удалить основной метод из вашего представления. В вашем логическом классе вам нужно сохранить установленную вами корневую панель. И затем вы можете поместить/изменить свой «Вид» в свою панель. Ваше представление больше не может расширять приложение! Сделайте его частью некоторой панели.

private final BorderPane rootPane = new BorderPane(); // Class field 

// in your start method 
final Scene scene = new Scene(rootPane); 
primaryStage.setScene(scene); 

//Change View like this: 
View v = new BView(); 
rootPane.setCenter(v.getRec()); 

// later you can set your color 
v.setColor() 


// Your View class: 
public class View{ 
    private Rectangle rect; 

    public View(){ 
     rect = new Rectangle(10, 10, 100, 100); 
     rect.setFill(Color.WHITE);    
     rect.setStroke(Color.BLACK); 
    } 

    public Rectangle getRec(){ 
     return this.rect; 
    } 
} 

также посмотреть на this Documentatino here

+0

Если я правильно понял, мне также нужно удалить метод начала класса View. Кроме того, логический класс должен расширять приложение и внедрять метод start, содержащий инструкции в вашем сообщении. К сожалению, вид все еще не отображается. – user3803086

+0

Да, только один основной метод во всем приложении! И да, эти строки. Если вы хотите изменить свой вид, вы можете вызвать rootPane.setCenter (xxx) со всего мира в своем main.class – Tobi

+0

И как я могу отобразить представление? Я сделал все так, как ты сказал, но окно не появляется. – user3803086

1

Ваша проблема в том, что вы создаете свой собственный экземпляр View. Когда вы вызываете основной метод static (String [] args), он создает свой собственный экземпляр View и показывает это. Посмотрите на JavaFX 2.2 Application.

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

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

В другом классе:

private static View view; 

public static void setView(View view) { 
    this.view = view; 
} 

Тогда внутри метода запуска зрения, добавьте строку:

OtherClass.setView(this); 

На другой ноте, если вы ищете Model/View разделения, его не может быть хорошей идеей создать экземпляр представления (приложения) изнутри модели (класс, содержащий бизнес-логику). Это парадокс, поскольку модель теперь зависит от вида (т. Е. Модель не должна знать о прямоугольнике). Лучше всего было бы создать экземпляр класса Model в методе start(), и ваше приложение будет работать с интерфейсом вашей модели. Таким образом, ваш класс приложения действует как адаптер, связывающий элементы управления графическим интерфейсом, чтобы инициировать события в вашей модели.

+0

Большое спасибо! Моя проблема заключается в том, что логика бизнес-процессов постоянно меняет вид (точнее, прямоугольники). Действительно ли в этом конкретном случае создать объект представления в бизнес-логике? – user3803086

+0

Вы можете, конечно, создать свой вид повсюду, но вам нужно удалить второй основной метод! – Tobi

+0

И как я могу отобразить представление при запуске класса, содержащего бизнес-логику? – user3803086

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