Открыть новую панель двойным кликом

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

package javafxapplication2;  
import javafx.application.Application;  
import javafx.beans.property.SimpleStringProperty;  
import javafx.beans.property.StringProperty;  
import javafx.beans.value.ChangeListener;  
import javafx.beans.value.ObservableValue;  
import javafx.collections.FXCollections;  
import javafx.collections.ObservableList;  
import javafx.event.ActionEvent;  
import javafx.event.EventHandler;  
import javafx.geometry.Insets;  
import javafx.geometry.Pos;  
import javafx.scene.Group;  
import javafx.scene.Scene;  
import javafx.scene.control.Button;  
import javafx.scene.control.Label;  
import javafx.scene.control.ListCell;  
import javafx.scene.control.ListView;  
import javafx.scene.control.Tooltip;  
import javafx.scene.layout.GridPane;  
import javafx.scene.layout.HBox;  
import javafx.scene.paint.Color;  
import javafx.stage.Stage;  
import javafx.util.Callback;  
class Person {  
    private StringProperty aliasName;  
    private StringProperty newPanelName;  
    private StringProperty newPanelDescription;  
    private ObservableList<Person> panels = FXCollections.observableArrayList();  
    public final void setAliasName(String value) {  
        aliasNameProperty().set(value);  
    }  
    public final String getAliasName() {  
        return aliasNameProperty().get();  
    }  
    public StringProperty aliasNameProperty() {  
        if (aliasName == null) {  
            aliasName = new SimpleStringProperty();  
        }  
        return aliasName;  
    }  
    public final void setNewPanelName(String value) {  
        newPanelNameProperty().set(value);  
    }  
    public final String getNewPanelName() {  
        return newPanelNameProperty().get();  
    }  
    public StringProperty newPanelNameProperty() {  
        if (newPanelName == null) {  
            newPanelName = new SimpleStringProperty();  
        }  
        return newPanelName;  
    }  
    public final void setNewPanelDescription(String value) {  
        newPanelDescriptionProperty().set(value);  
    }  
    public final String getNewPanelDescription() {  
        return newPanelDescriptionProperty().get();  
    }  
    public StringProperty newPanelDescriptionProperty() {  
        if (newPanelDescription == null) {  
            newPanelDescription = new SimpleStringProperty();  
        }  
        return newPanelDescription;  
    }  
    public ObservableList<Person> panelsProperty() {  
        return panels;  
    }  
    public Person(String alias, String newPanelName, String newPanelDescription) {  
        setAliasName(alias);  
        setNewPanelName(newPanelName);  
        setNewPanelDescription(newPanelDescription);  
    }  
}  
public class JavaFXApplication2 extends Application {  
    public static void main(String[] args) {  
        Application.launch(args);  
    }  
    @Override  
    public void start(final Stage primaryStage) {  
        primaryStage.setTitle("test");  
        Group root = new Group();  
        Scene scene = new Scene(root, 500, 250, Color.WHITE);  
        // create a grid pane  
        GridPane gridpane = new GridPane();  
        gridpane.setPadding(new Insets(5));  
        gridpane.setHgap(10);  
        gridpane.setVgap(10);  
        ObservableList<Person> leaders = FXCollections.observableArrayList();  

        leaders.add(new Person("test 1", "test 11", "test 111"));  
        leaders.add(new Person("test 2", "test 22", "test 222"));  
        leaders.add(new Person("test 3", "test 33", "test 333"));  
        leaders.add(new Person("test 4", "test 44", "test 444"));  
        final ListView<Person> leaderListView = new ListView<>(leaders);  
        leaderListView.setPrefWidth(450);  
        leaderListView.setPrefHeight(150);  
        //  
        leaderListView.setCellFactory(new Callback<ListView<Person>, ListCell<Person>>() {  
            @Override  
            public ListCell<Person> call(ListView<Person> param) {  
                final Label leadLbl = new Label();  
                final Tooltip tooltip = new Tooltip();  
                final ListCell<Person> cell = new ListCell<Person>() {  
                    @Override  
                    public void updateItem(Person item, boolean empty) {  
                        super.updateItem(item, empty);  
                        if (item != null) {  
                            leadLbl.setText(item.getAliasName());  
                            setText(item.getNewPanelName());// + " " + item.getNewPanelDescription());  
                            tooltip.setText(item.getAliasName());  
                            setTooltip(tooltip);  
                        }  
                    }  
                }; // ListCell  
                return cell;  
            }  
        }); // setCellFactory  
        gridpane.add(leaderListView, 0, 1);  
        leaderListView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Person>() {  
            @Override  
            public void changed(ObservableValue<? extends Person> observable,  
                    Person oldValue, Person newValue) {  
                System.out.println("selection changed");  
            }  
        });  

        // Buttons  

        // Button "Open"  
        Button btnYes = new Button("Open");  

        btnYes.setOnAction(new EventHandler<ActionEvent>()  
        {  
            @Override  
            public void handle(ActionEvent event)  
            {  
                //Open Here the selected panel  
                primaryStage.close();  
            }  
        });  

        // Button "Cancel"  
        Button btnNo = new Button("Cancel");  
        btnNo.setOnAction(new EventHandler<ActionEvent>()  
        {  
            @Override  
            public void handle(ActionEvent event)  
            {  
                primaryStage.close();  
            }  
        });  

        HBox hbox = new HBox();  
        hbox.setSpacing(10);  
        hbox.setAlignment(Pos.CENTER);  
        hbox.getChildren().add(btnYes);  
        hbox.getChildren().add(btnNo);  

        gridpane.add(hbox, 0, 2);  

        root.getChildren().add(gridpane);  
        primaryStage.setScene(scene);  
        primaryStage.show();  
    }  
}  

Я хочу, чтобы при двойном щелчке по строке открывалась соответствующая новая панель, например, тест 11.

А также я хочу, когда я выбираю одним щелчком мыши и нажимаю кнопку «Открыть», чтобы открыть новое окно.

Может помочь изменить код?


person Peter Penzov    schedule 04.10.2013    source источник
comment
какую панель показать? Человек не панель...   -  person Magcus    schedule 04.10.2013
comment
Новый код панели, который я хочу показать, когда я дважды щелкаю или выбираю и нажимаю кнопку «Выбрать», не отображается. Идея состоит в том, что я хочу открыть новое окно на основе выбора выбора.   -  person Peter Penzov    schedule 04.10.2013
comment
Тогда этот новый конструктор окна получает в качестве параметра человека?   -  person Magcus    schedule 04.10.2013
comment
Вы знакомы с Oracle SQL Developer? Откройте программное обеспечение. Нажмите NEW в меню выше, и вы увидите окно с заголовком Create a new. И на основе выбора вы перенаправлены в новое окно. Я хочу реализовать тот же случай навигации.   -  person Peter Penzov    schedule 04.10.2013


Ответы (1)


Если я правильно понял ваши комментарии, вы хотите сделать что-то подобное вместо того, чтобы печатать «выделение изменено»:

leaderListView.getSelectionModel().selectedItemProperty()
                .addListener(new ChangeListener<Person>() {
                    @Override
                    public void changed(
                            ObservableValue<? extends Person> observable,
                            Person oldValue, Person newValue) {
                        StackPane pane = new StackPane();
                        Scene scene = new Scene(pane);
                        Stage stage = new Stage();
                        stage.setScene(scene);

                        pane.getChildren().add(
                                new TextField(newValue.getAliasName()));

                        stage.show();

                    }
                });

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


РЕДАКТИРОВАТЬ (запрошено в комментариях):

Если вы хотите обнаружить двойной щелчок, вам придется работать с обработчиками событий:

вот подход (удалите код, предложенный выше, и добавьте это):

leaderListView.setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent mouseEvent) {

            if (mouseEvent.getButton().equals(MouseButton.PRIMARY)) {
                if (mouseEvent.getClickCount() == 2) {
                    Person item = leaderListView.getSelectionModel()
                            .getSelectedItem();
                    if (item != null) {
                        StackPane pane = new StackPane();
                        Scene scene = new Scene(pane);
                        Stage stage = new Stage();
                        stage.setScene(scene);

                        pane.getChildren().add(
                                new TextField(item.getAliasName()));

                        stage.show();
                    }

                }
            }
        }
    });
person Magcus    schedule 04.10.2013
comment
Да! Но это только часть решения. Можете ли вы изменить свой код, чтобы он работал только при двойном щелчке? - person Peter Penzov; 04.10.2013
comment
Хорошо, еще одна проблема, которую я должен решить. Как я могу выбрать одну строку из списка, а затем, когда я нажимаю кнопку «Выбрать», чтобы открыть новое окно на основе выбора? - person Peter Penzov; 04.10.2013
comment
Это другой подход... Вам нужно будет использовать строку: Person item = LeaderListView.getSelectionModel() .getSelectedItem(); в событии мыши, чтобы получить выбранный элемент. - person Magcus; 04.10.2013
comment
Я хотел бы использовать их обоих. - person Peter Penzov; 04.10.2013
comment
Я только что ответил на ваш другой пост. - person Magcus; 05.10.2013