2012-04-01 35 views
7

Tôi biết rằng có những người nghe trong JavaFX và tôi chắc chắn là Java. Nhưng tôi bối rối như thế nào để thực hiện chúng.Thêm một người nghe vào một biến trong Java/JavaFX được gọi là thay đổi biến

Tôi có biến boolean được thay đổi trong suốt chương trình của tôi. Mỗi khi boolean được thay đổi, tôi muốn một hàm myFunc() được chạy.

Điều này có thể thực hiện dễ dàng không?

+0

Ông có thể cho chúng ta thấy một số mã? Tôi không nghĩ rằng những gì bạn đang yêu cầu là có thể nhưng hiệu quả tương tự có thể được thực hiện theo một cách khác. – chandsie

Trả lời

4

Như đơn giản như thế này:

public void changeBooleanFlag(boolean bEnabled) 
{ 
    if(booleanFlag == bEnabled) return; 
    booleanFlag = bEnabled; 
    myFunc(); 
} 

và bất cứ khi nào bạn muốn thay đổi cờ boolean, bạn nên làm điều đó thông qua phương pháp này.

+3

Nếu bạn sử dụng giải pháp của câu trả lời này và nếu bạn đang truy cập quy trình này từ nhiều luồng, bạn chắc chắn muốn triển khai một số cơ chế đồng bộ hóa. –

0

Có 2 giải pháp cho vấn đề của bạn

  1. Sử dụng đồng bằng Java, trong trường hợp đó, bạn phải thêm người nghe để đậu của bạn (một mình) và sau đó gọi phương pháp nghe về phương pháp setter (một lần nữa một mình) và tạo biến riêng, do đó, chỉ có thể sửa đổi bằng phương thức setter của bạn.
  2. Giải pháp thứ hai là sử dụng khung công tác AOP thuần túy (tôi biết AspectJ có thể thực hiện việc này), có thể chặn thay đổi biến của bạn và sau đó gọi người nghe của bạn bằng cách sử dụng một khía cạnh. Tôi sẽ đề cập đến việc sử dụng @AspectJ (hỗ trợ chú thích của AspectJ), các khía cạnh của bạn sẽ là các lớp Java thuần túy và không cần đến một IDE hỗ trợ AspectJ.
+0

Để biết thêm thông tin về giải pháp đầu tiên, hãy xem Đặc điểm kỹ thuật và mẫu của JavaBeans. –

0

U có thể sử dụng mẫu thiết kế quan sát. Chỉ cần như thế này:

public interface Listener 
    { 
     public void handle(Object o) ; 
    } 

    public class PropertiesChangeListener 
    { 
     public void handle(Object o) { 
     //DO SOMETHING... 
     } 
    } 

    public class Bean { 
     private boolean flag; 
     private List<Listener> listeners = new ArrayList<Listener>(); 

     public setFlag(boolean flag) { 
     this.flag = flag; 
     if (listeners.size() > 0) { 
      for (Listener l : this.listeners) { 
       l.handle(flag); //invoke 
      } 
     } 
     } 

     public registerListener(Listener listener) { 
     this.listeners.add(listener); 
     } 

     //..... other fields and methods 

    } 

    public class Main{ 

     public static void main(String[] args) { 
     Bean bean = new Bean(); 
     bean.registerListener(new PropertiesChangeListener()); 
     bean.setFlag(true); //handler method will be invoked.. 
     } 
    } 
22

Nếu bạn đang sử dụng JavaFX 2 sau đó nó cung cấp một giải pháp out-of-box cho cả kiến ​​trúc JavaBeans thành phần và mẫu thiết kế Observer. Hơn nữa nó cho một sự linh hoạt tuyệt vời của việc kết hợp trạng thái của các biến bởi các ràng buộc thuộc tính. Đoạn mã dưới đây minh họa thuộc tính đã thay đổi các sự kiện và sự ràng buộc của các biến thuộc tính. Tất nhiên bạn có thể quấn các trình truy cập thuộc tính để ẩn các chi tiết bằng cách như getFlag()setFlag() bên dưới và sử dụng chúng trong phần còn lại của ứng dụng.

public class Demo extends Application { 

    private BooleanProperty booleanProperty = new SimpleBooleanProperty(true); 

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

    @Override 
    public void start(Stage primaryStage) { 

     // Add change listener 
     booleanProperty.addListener(new ChangeListener<Boolean>() { 

      @Override 
      public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
       System.out.println("changed " + oldValue + "->" + newValue); 
       myFunc(); 
      } 
     }); 

     Button btn = new Button(); 
     btn.setText("Toggle boolean flag"); 
     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       booleanProperty.set(!booleanProperty.get()); //toggle 
       System.out.println("toggled to " + booleanProperty.get()); 
      } 
     }); 

     // Bind to another property variable 
     btn.underlineProperty().bind(booleanProperty); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 
     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 

    public boolean getFlag() { 
     return booleanProperty.get(); 
    } 

    public void setFlag(boolean val) { 
     booleanProperty.set(val); 
    } 
} 
2

Tôi sẽ làm điều đó bằng cách sử dụng PropertyChangeListener. Đây là một hướng dẫn tốt đẹp: http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html

Ví dụ mã:

import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.util.ArrayList; 
import java.util.List; 

public class MyClass { 
    private final List<PropertyChangeListener> listeners = new ArrayList<>(); 
    private boolean b1, b2; 

    public MyClass() { 
    } 

    public boolean isB1() { 
     return b1; 
    } 

    public void setB1(boolean b1) { 
     boolean oldValue = this.b1; 
     this.b1 = b1; 
     firePropertyChange("b1", oldValue, b1); 
    } 

    public boolean isB2() { 
     return b2; 
    } 

    public void setB2(boolean b2) { 
     boolean oldValue = this.b2; 
     this.b2 = b2; 
     firePropertyChange("b2", oldValue, b2); 
    } 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     listeners.add(listener); 
    } 

    private void firePropertyChange(String property, Object oldValue, Object newValue) { 
     for (PropertyChangeListener l : listeners) { 
      l.propertyChange(new PropertyChangeEvent(this, property, oldValue, newValue)); 
     } 
    } 

    /** 
    * Main method for tests. 
    * @param args 
    */ 
    public static void main(String[] args) { 
     MyClass m = new MyClass(); 

     m.addPropertyChangeListener(new PropertyChangeListener() { 
      @Override 
      public void propertyChange(PropertyChangeEvent e) { 
       String changedProperty = e.getPropertyName(); 
       System.out.println("Changed property: " + changedProperty); 
       System.out.println("New value: " + e.getNewValue()); 
       System.out.println("Old value: " + e.getOldValue()); 
       System.out.println(); 
      } 
     }); 

     m.setB1(true); 
     m.setB2(false); 
    } 
} 
Các vấn đề liên quan