我正在尝试创建两个单独的类,分别在其中放置main和start方法,在一个类中创建具有ui组件的窗格

问题描述 投票:0回答:1
public class TableViewSample extends Application {
        @Override
        public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Table View Sample");
        stage.setWidth(450);
        stage.setHeight(550);

        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
    launch(args);
  }
}

我正在寻找的解决方案不应涉及在不需要Person中的TableViewSample类的同一类中创建应用程序。>

这可能吗?

public class Person {
    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;
    private final SimpleStringProperty email;
    Person(String fName, String lName, String email) {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
        this.email = new SimpleStringProperty(email);
    }
    public String getFirstName() {
        return firstName.get();
    }
    public void setFirstName(String fName) {
        firstName.set(fName);
    }
    public String getLastName() {
        return lastName.get();
    }
    public void setLastName(String fName) {
        lastName.set(fName);
    }
    public String getEmail() {
        return email.get();
    }
    public void setEmail(String fName) {
        email.set(fName);
    }
}
public class PeopleForm  
{
   private TableView<Person> table = new TableView<>();
   private final ObservableList<Person> data
           = FXCollections.observableArrayList(
                   new Person("Jacob", "Smith", "[email protected]"),
                   new Person("Isabella", "Johnson", "[email protected]"),
                   new Person("Ethan", "Williams", "[email protected]"),
                   new Person("Emma", "Jones", "[email protected]"),
                   new Person("Michael", "Brown", "[email protected]"));
   final HBox hb = new HBox();

    final Label label = new Label("Address Book");

   public MusicForm(String fName, String lName, String email) {
       super(fName, lName, email);
   }
       label.setFont(new Font("Arial", 20));
       table.setEditable(true);
       Callback<TableColumn, TableCell> cellFactory =
            new Callback<TableColumn, TableCell>() {
                public TableCell call(TableColumn p) {
                   return new EditingCell();
                }
            };
       TableColumn firstNameCol = new TableColumn("First Name");
       firstNameCol.setMinWidth(100);
       firstNameCol.setCellValueFactory(
           new PropertyValueFactory<Person, String>("firstName"));
       firstNameCol.setCellFactory(cellFactory);
       firstNameCol.setOnEditCommit(
           new EventHandler<CellEditEvent<Person, String>>() {
               @Override
               public void handle(CellEditEvent<Person, String> t) {
                   ((Person) t.getTableView().getItems().get(
                       t.getTablePosition().getRow())
                 ).setFirstName(t.getNewValue());
               }
            }
       );
       TableColumn lastNameCol = new TableColumn("Last Name");
       lastNameCol.setMinWidth(100);
       lastNameCol.setCellValueFactory(
       new PropertyValueFactory<Person, String>("lastName"));
       lastNameCol.setCellFactory(cellFactory);
       lastNameCol.setOnEditCommit(
           new EventHandler<CellEditEvent<Person, String>>() {
               @Override
               public void handle(CellEditEvent<Person, String> t) {
                   ((Person) t.getTableView().getItems().get(
                       t.getTablePosition().getRow())
                 ).setLastName(t.getNewValue());
               }
           }
       )
       TableColumn emailCol = new TableColumn("Email");
       emailCol.setMinWidth(200);
       emailCol.setCellValueFactory(
           new PropertyValueFactory<Person, String>("email"));
       emailCol.setCellFactory(cellFactory);
       emailCol.setOnEditCommit(
           new EventHandler<CellEditEvent<Person, String>>() {
               @Override
               public void handle(CellEditEvent<Person, String> t) {
                   ((Person) t.getTableView().getItems().get(
                       t.getTablePosition().getRow())
                  ).setEmail(t.getNewValue());
               }
           }
       );
    final TextField addFirstName = new TextField();
       addFirstName.setPromptText("First Name");
       addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
       final TextField addLastName = new TextField();
       addLastName.setMaxWidth(lastNameCol.getPrefWidth());
       addLastName.setPromptText("Last Name");
       final TextField addEmail = new TextField();
       addEmail.setMaxWidth(emailCol.getPrefWidth());
       addEmail.setPromptText("Email");
       final Button addButton = new Button("Add");
       addButton.setOnAction(new EventHandler<ActionEvent>() {
           @Override
            void handle(ActionEvent e) {
               data.add(new Person(
                       addFirstName.getText(),
                       addLastName.getText(),
                       addEmail.getText()));
               addFirstName.clear();
               addLastName.clear();
               addEmail.clear();
           }
       });
     hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
       hb.setSpacing(3);
       final VBox vbox = new VBox();
       vbox.setSpacing(5);
       vbox.setPadding(new Insets(10, 0, 0, 10));
       vbox.getChildren().addAll(label, table, hb);
       ((Group) scene.getRoot()).getChildren().addAll(vbox);

   @Override
   public void start(Stage primaryStage) throws Exception {
       throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
   }

   class EditingCell extends TableCell<Person, String> {
       private TextField textField;
       public EditingCell() {
       }
       @Override
       public void startEdit() {
           if (!isEmpty()) {
               super.startEdit();
               createTextField();
               setText(null);
               setGraphic(textField);
               textField.selectAll();
           }
       }
       @Override
       public void cancelEdit() {
           super.cancelEdit();

           setText((String) getItem());
           setGraphic(null);
       }

       @Override
       public void updateItem(String item, boolean empty) {
           super.updateItem(item, empty);

            if (empty) {
               setText(null);
               setGraphic(null);
           } else {
               if (isEditing()) {
                   if (textField != null) {
                       textField.setText(getString());
                   }
                   setText(null);
                   setGraphic(textField);
               } else {
                   setText(getString());
                   setGraphic(null);
               }
           }
       }
       private void createTextField() {
           textField = new TextField(getString());
           textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
           textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
               @Override
               public void changed(ObservableValue<? extends Boolean> arg0,
                       Boolean arg1, Boolean arg2) {
                   if (!arg2) {
                       commitEdit(textField.getText());
                   }
               }
           });
       }
       private String getString() {
          return getItem() == null ? "" : getItem().toString();
       }
   }

}

我发现的问题是我不知道将Person类放在哪里并且在类Person]中添加PeopleForm类是不合适的

我该如何进行这项工作?

公共类TableViewSample扩展了应用程序{@Override public void start(Stage stage){Scene scene = new Scene(new Group()); stage.setTitle(“ Table View Sample”); ...

javafx
1个回答
0
投票

公共类TableViewSample扩展了Application {

private TableView<Person> table = new TableView<Person>();
private final ObservableList<Person> data =
        FXCollections.observableArrayList(
        new Person("Jacob", "Smith", "[email protected]"),
        new Person("Isabella", "Johnson", "[email protected]"),
        new Person("Ethan", "Williams", "[email protected]"),
        new Person("Emma", "Jones", "[email protected]"),
        new Person("Michael", "Brown", "[email protected]"));
final HBox hb = new HBox();

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

@Override
public void start(Stage stage) {
    Scene scene = new Scene(new Group());
    stage.setTitle("Table View Sample");
    stage.setWidth(450);
    stage.setHeight(550);

    final Label label = new Label("Address Book");
    label.setFont(new Font("Arial", 20));

    table.setEditable(true);
    Callback<TableColumn, TableCell> cellFactory =
         new Callback<TableColumn, TableCell>() {
             public TableCell call(TableColumn p) {
                return new EditingCell();
             }
         };

    TableColumn firstNameCol = new TableColumn("First Name");
    firstNameCol.setMinWidth(100);
    firstNameCol.setCellValueFactory(
        new PropertyValueFactory<Person, String>("firstName"));
    firstNameCol.setCellFactory(cellFactory);
    firstNameCol.setOnEditCommit(
        new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                ((Person) t.getTableView().getItems().get(
                    t.getTablePosition().getRow())
                    ).setFirstName(t.getNewValue());
            }
         }
    );


    TableColumn lastNameCol = new TableColumn("Last Name");
    lastNameCol.setMinWidth(100);
    lastNameCol.setCellValueFactory(
        new PropertyValueFactory<Person, String>("lastName"));
    lastNameCol.setCellFactory(cellFactory);
    lastNameCol.setOnEditCommit(
        new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                ((Person) t.getTableView().getItems().get(
                    t.getTablePosition().getRow())
                    ).setLastName(t.getNewValue());
            }
        }
    );

    TableColumn emailCol = new TableColumn("Email");
    emailCol.setMinWidth(200);
    emailCol.setCellValueFactory(
        new PropertyValueFactory<Person, String>("email"));
    emailCol.setCellFactory(cellFactory);
    emailCol.setOnEditCommit(
        new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                ((Person) t.getTableView().getItems().get(
                    t.getTablePosition().getRow())
                    ).setEmail(t.getNewValue());
            }
        }
    );

    table.setItems(data);
    table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);

    final TextField addFirstName = new TextField();
    addFirstName.setPromptText("First Name");
    addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
    final TextField addLastName = new TextField();
    addLastName.setMaxWidth(lastNameCol.getPrefWidth());
    addLastName.setPromptText("Last Name");
    final TextField addEmail = new TextField();
    addEmail.setMaxWidth(emailCol.getPrefWidth());
    addEmail.setPromptText("Email");

    final Button addButton = new Button("Add");
    addButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent e) {
            data.add(new Person(
                    addFirstName.getText(),
                    addLastName.getText(),
                    addEmail.getText()));
            addFirstName.clear();
            addLastName.clear();
            addEmail.clear();
        }
    });

    hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
    hb.setSpacing(3);

    final VBox vbox = new VBox();
    vbox.setSpacing(5);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().addAll(label, table, hb);

    ((Group) scene.getRoot()).getChildren().addAll(vbox);

    stage.setScene(scene);
    stage.show();
}

public static class Person {

    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;
    private final SimpleStringProperty email;

    private Person(String fName, String lName, String email) {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
        this.email = new SimpleStringProperty(email);
    }

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String fName) {
        firstName.set(fName);
    }

    public String getLastName() {
        return lastName.get();
    }

    public void setLastName(String fName) {
        lastName.set(fName);
    }

    public String getEmail() {
        return email.get();
    }

    public void setEmail(String fName) {
        email.set(fName);
    }
}

class EditingCell extends TableCell<Person, String> {

    private TextField textField;

    public EditingCell() {
    }

    @Override
    public void startEdit() {
        if (!isEmpty()) {
            super.startEdit();
            createTextField();
            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();

        setText((String) getItem());
        setGraphic(null);
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            if (isEditing()) {
                if (textField != null) {
                    textField.setText(getString());
                }
                setText(null);
                setGraphic(textField);
            } else {
                setText(getString());
                setGraphic(null);
            }
        }
    }

    private void createTextField() {
        textField = new TextField(getString());
        textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
        textField.focusedProperty().addListener(new ChangeListener<Boolean>(){
            @Override
            public void changed(ObservableValue<? extends Boolean> arg0, 
                Boolean arg1, Boolean arg2) {
                    if (!arg2) {
                        commitEdit(textField.getText());
                    }
            }
        });
    }

    private String getString() {
        return getItem() == null ? "" : getItem().toString();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.