观察者与getstyleclass()侦听器之间的Javafx冲突

时间:2018-11-17 22:56:20

标签: java css javafx observable

我对JavaFX应用程序有疑问。

我有一个在hbox中创建按钮列表的类。 此类扩展了AnchorPane。

当我单击一个按钮时,我更改了应用于此按钮的css类,以及上一个按钮,因此再次正常。 问题是要添加一个观察者,这样我的按钮才能有用。

由于我的课程已经在扩展AnchorPane,因此我无法扩展Observable,因此我创建了一个带有静态方法的新类。此类是被观察的类,并在调用方法时通知被观察者。

这是带有按钮列表的类的代码:

/**
 *
 * @author olivier
 */
public class SpecificElementViewController extends AnchorPane implements Initializable {

  private List<String> elementTypesList;

  @FXML
  private HBox hbox;

  private Button selectedButton = null;

  private SpecificElementListTypes specificElementType;

  public SpecificElementViewController() {
  }

  @Override
  public void initialize(URL location, ResourceBundle resources) {
    hbox.setAlignment(Pos.CENTER);
  }

  public List<String> getElementTypes() {
    return elementTypesList;
  }

  public void setElementTypes(List<String> elementTypesList, SpecificElementListTypes type) {
    this.specificElementType = type;
    Button button;

    if (elementTypesList != null && !elementTypesList.isEmpty()) {

      for (String s : elementTypesList) {
        button = new Button(s);

        button.setOnAction(new EventHandler<ActionEvent>() {
          @Override
          public void handle(ActionEvent event) {
            System.out.println("Pressed button : " + ((Button) event.getSource()).getText());
            if (selectedButton.getStyleClass().contains("selectedNode")) {
              selectedButton.getStyleClass().remove("selectedNode");
            }
            selectedButton = (Button) event.getSource();
            selectedButton.getStyleClass().add("selectedNode");
            SpecificElementViewObservable.handleSpecificElementListClick(specificElementType, selectedButton);
          }
        });
        hbox.getChildren().add(button);
      }
      if (selectedButton == null) {
        selectedButton = (Button) hbox.getChildren().get(0);
        selectedButton.getStyleClass().add("selectedNode");
      }
    }
  }

这是可观察类的类:

public class SpecificElementViewObservable extends Observable {

  private static SpecificElementViewObservable instance;

  public static void handleSpecificElementListClick(SpecificElementListTypes elementType, Button button) {
    SpecificElementViewObservable.getInstance().setChanged();
    SpecificElementViewObservable.getInstance().notifyObservers(new SpecificElementEvent(elementType, button));
  }

  public static SpecificElementViewObservable getInstance() {
    if (instance == null) {
      instance = new SpecificElementViewObservable();
    }
    return instance;
  }
}

观察该类的类太大,无法在此处添加,我只添加addobserver和update方法:

/**
 *
 * @author olivier
 */
public class MainWindowController extends AnchorPane implements Initializable, Observer {

   @Override
  public void initialize(URL location, ResourceBundle resources) {
     SpecificElementViewObservable.getInstance().addObserver(this);
  }

public void update(Observable o, Object arg) {
        System.out.println("Receive update");
        if (arg instanceof SpecificElementEvent) {
          SpecificElementEvent event = (SpecificElementEvent) arg;
          System.out.println("Type : " + event.getType().toString());
          System.out.println("Button text : " + event.getButton().getText());
          try {
            handlePlanetMenuClick(null);
          } catch (Exception ex) {
            System.out.println("Error using null mouseEvent : " + ex.getMessage());
          }
        } else {
          System.out.println("Error unknown event");
        }
      }

此问题是我无法使我的监听器与CSS更新一起使用。 使用此代码,我的侦听器可以工作,但未应用css。 正如您在setElementTypes方法上看到的那样,将创建按钮列表,第一个按钮被视为“选定”。这时,将应用css(按钮为黄色,selectedButton除外为红色)。 当我单击另一个按钮时,红色的按钮再次变为黄色,但是新的selectedButton保持黄色(selectedButton的值已更改)。此后,CSS永不更改。

如果我删除此行:

SpecificElementViewObservable.handleSpecificElementListClick(specificElementType, selectedButton);

或这些行:

SpecificElementViewObservable.getInstance().setChanged();
SpecificElementViewObservable.getInstance().notifyObservers(new SpecificElementEvent(elementType, button));

或切换

SpecificElementViewObservable.getInstance().notifyObservers(new SpecificElementEvent(elementType, button));

至:

SpecificElementViewObservable.getInstance().notifyObservers();

然后每次我的侦听器不起作用(这是正常的),但是css再次起作用。

我也尝试从update方法中删除条件,因此我可以使用无参数的notifyObservers()。再次,我的侦听器有效,但CSS无效。

您知道问题出在哪里吗?

1 个答案:

答案 0 :(得分:0)

我将我的按钮替换为toggleButtons和ToggleGroup。 我仍然不知道问题出在哪里,但是使用它可以更轻松地完成工作。 我认为问题是由于需要自己处理所选按钮而引起的错误,并且已通过使用toggleButtons的setSelected()和isSelected方法进行了修复。