我对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无效。
您知道问题出在哪里吗?
答案 0 :(得分:0)
我将我的按钮替换为toggleButtons和ToggleGroup。 我仍然不知道问题出在哪里,但是使用它可以更轻松地完成工作。 我认为问题是由于需要自己处理所选按钮而引起的错误,并且已通过使用toggleButtons的setSelected()和isSelected方法进行了修复。