TableView komponent är en av de mångsidiga komponenter som ofta används i JavaFX-applikationsutveckling. Det gör det möjligt för en att visuellt organisera data snabbt. En tittare kan snabbt förstå även den implicita information som informationen avser med dess tabellform. Den här artikeln utforskar denna komponent ur dataorganisationens synvinkel och hur den effektivt kan användas i Java-programmering.
TableView
TableView kontroll ger nästan likvärdig funktionalitet som Swings Jtable komponent. Den är utformad för att representera ett obegränsat antal rader med data, uppdelade i kolumner. I JavaFX finns det en annan komponent som heter ListView , vilket är liknande. Den enda skillnaden är att TableView stöder flera kolumner medan ListView har en enda kolumn. Funktionerna i TableView kontroll är följande:
- Eftersom en tabell består av antal kolumner representeras varje kolumn av Tabellkolumnen klass. Denna klass ger en finare kontroll över kolumnen. En instans av den här klassen är ansvarig för att visa och ändra innehållet i den kolumnen. Därför innehåller den ett antal justerbara egenskaper. Till exempel,
- Den kan ändras storlek med egenskapen width (minWidth, maxWidth, prefWidth, width ).
- Synligheten för kolumnen kan växlas med synlighet egendom.
- Det finns sätter- och gettermetoder för kolumnrubriker och textegenskaper.
- Kan visa kapslade kolumner.
- Det finns en snabbmeny som användaren kan högerklicka på till kolumnrubriken.
- Innehåll kan sorteras (med komparator). , sorterbar , sortType ).
- Det finns policyer för storleksändring för tabellen som bestämmer tabellens tillstånd när användaren ändrar storlek på kolumnen.
- Ger stöd för att sortera flera kolumner.
Skapa en TableView
Låt oss skapa ett exempelprogram för att visa hur TableView i JavaFX kan användas. Låt oss först introducera grunderna i JavaFX TableView i kod. Eftersom en tabell visar data skapar vi en klass som innehåller data.
package sample; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; public class Employee { private StringProperty name; private StringProperty phone; private StringProperty email; private IntegerProperty salary; public Employee(String name, String phone, String email, Integer salary) { setName(name); setPhone(phone); setEmail(email); setSalary(salary); } public StringProperty nameProperty(){ if(name == null) name = new SimpleStringProperty(); return name; } public StringProperty phoneProperty() { if(phone == null) phone = new SimpleStringProperty(); return phone; } public StringProperty emailProperty() { if(email == null) email = new SimpleStringProperty(); return email; } public IntegerProperty salaryProperty() { if(salary == null) salary = new SimpleIntegerProperty(); return salary; } public void setName(String name) { nameProperty().setValue(name); } public String getName() { return nameProperty().get(); } public void setPhone(String phone) {phoneProperty().setValue(phone);} public String getPhone() { return phoneProperty().get(); } public void setEmail(String email) { emailProperty().setValue(email);} public String getEmail() { return emailProperty().get(); } public void setSalary(Integer salary) { salaryProperty().setValue(salary);} public Integer getSalary() { return salaryProperty().get(); } }
Låt oss nu skapa applikationslayouten och lägga till TableView som den enda komponenten i scenen.
package sample; import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class AppMain extends Application { @Override public void start(Stage primaryStage) throws Exception { BorderPane root = new BorderPane(); root.setPrefSize(600,400); final TableView<Employee> employeeTableView = new TableView<>(); employeeTableView.setPrefWidth(500); employeeTableView.setItems(dummyEmployees()); TableColumn<Employee, String> nameCol = new TableColumn<>("Name"); nameCol.setCellValueFactory( new PropertyValueFactory<Employee, String>("Name")); TableColumn<Employee, String> phoneCol = new TableColumn<>("Phone"); phoneCol.setCellValueFactory( new PropertyValueFactory<Employee, String>("Phone")); TableColumn<Employee, String> emailCol = new TableColumn<>("Email"); emailCol.setCellValueFactory( new PropertyValueFactory<Employee, String>("Email")); TableColumn<Employee, Integer> salaryCol = new TableColumn<>("Salary"); salaryCol.setCellValueFactory( new PropertyValueFactory<Employee, Integer>("Salary")); employeeTableView.getColumns().addAll(nameCol,phoneCol, emailCol,salaryCol); root.setCenter(employeeTableView); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.setTitle("JavaFX TableView Demonstration"); primaryStage.show(); } private static ObservableList<Employee> dummyEmployees() { ObservableList<Employee> employees = FXCollections.observableArrayList(); employees.add(new Employee("Arko Bannerjee", "9876543210","[email protected]", 5600)); employees.add(new Employee("Subir Sha", "8109276354","[email protected]",7200)); employees.add(new Employee("Karoline Bhatt", "638374642","[email protected]",3600)); employees.add(new Employee("Vikas Verma", "425637772","[email protected]",7800)); employees.add(new Employee("Gurmeet Singh", "9876543210","[email protected]",8900)); employees.add(new Employee("Partho Goel", "837743636","[email protected]",5644)); employees.add(new Employee("Hanish Jaiswal", "826355343","[email protected]",6500)); employees.add(new Employee("Preety Ahuja", "9298366454","[email protected]",7800)); employees.add(new Employee("Sandip Paul", "82773554536","[email protected]",8600)); employees.add(new Employee("Sudipto Sarkar", "73664552542","[email protected]",8200)); employees.add(new Employee("Bikash Panda", "6365344245","[email protected]",8400)); employees.add(new Employee("Abhronil Sahu", "7829293663","[email protected]",8000)); employees.add(new Employee("Dilip Das", "9283665455","[email protected]",8100)); return employees; } public static void main(String[] args) { launch(args); } }
Tabellen skapas med följande kod:
final TableView<Employee> employeeTableView = new TableView<>();
Innehållet i tabellen representeras av de kolumner som lagts till. Varje kolumn måste också ha en rubrik för att visuellt ange innehållet i kolumnen. I det här exemplet har vi ställt in fyra kolumner (betecknade av egenskapen definierad i Anställd klass).
TableColumn<Employee, String> nameCol = new TableColumn<>("Name"); nameCol.setEditable(true); nameCol.setCellValueFactory( new PropertyValueFactory<Employee, String>("Name"));
Utdata
Figur 1: Tabellens innehåll
Därefter har vi angett detta som huvudkomponenten i layouten. Det är allt vi behöver göra för att visa en del innehåll i TableView . Funktioner som att sortera innehållet kräver ingen speciell/ytterligare hantering eftersom de ges som standardfunktion av komponenten. Du kan också sortera flera gånger genom att hålla ned SKIFT-tangenten från tangentbordet medan du markerar kolumner med ett musklick.
Redigerbara kolumner i en tabell
Om vi vill skapa en tabell som har en redigerbar kolumn kan vi göra det mycket enkelt. När vi dubbelklickar på den redigerbara kolumnen visas en textruta där vi kan redigera värdet. För att göra ändringen permanent måste vi trycka på Enter-tangenten från tangentbordet.
Här är ett annat exempel med redigerbara kolumner.
package sample; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; public class PhoneBook { private StringProperty name; private StringProperty phone; public PhoneBook(String name, String phone) { setName(name); setPhone(phone); } public StringProperty nameProperty(){ if(name == null) name = new SimpleStringProperty(); return name; } public StringProperty phoneProperty(){ if(phone == null) phone = new SimpleStringProperty(); return phone; } public void setName(String name) { nameProperty().setValue(name); } public String getName() { return nameProperty().get(); } public void setPhone(String phone) { phoneProperty().setValue(phone);} public String getPhone() { return phoneProperty().get(); } @Override public String toString() { return getName()+" : "+getPhone(); } } package sample; import javafx.application.*; import javafx.beans.value.*; import javafx.collections.*; import javafx.geometry.*; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.control.cell.*; import javafx.scene.layout.*; import javafx.scene.text.*; import javafx.stage.*; public class PhoneBookTable extends Application { private TableView<PhoneBook> table; private ObservableList data; private Text txtStatus; @Override public void start(Stage primaryStage) { primaryStage.setTitle("Table View Demonstration."); HBox hb = new HBox(); hb.setAlignment(Pos.CENTER); table = new TableView<>(); data = dummyData(); table.setItems(data); TableColumn<PhoneBook,String> nameCol = new TableColumn<>("Name"); nameCol.setCellValueFactory(new PropertyValueFactory<>("name")); TableColumn<PhoneBook,String> phoneCol = new TableColumn("Phone"); phoneCol.setCellValueFactory(new PropertyValueFactory<>("phone")); table.getColumns().setAll(nameCol, phoneCol); table.setPrefWidth(400); table.setPrefHeight(250); table.setColumnResizePolicy(TableView. CONSTRAINED_RESIZE_POLICY); table.getSelectionModel().selectedIndexProperty(). addListener( new RowChangeHandler()); table.setEditable(true); phoneCol.setCellFactory(TextFieldTableCell. forTableColumn()); phoneCol.setOnEditCommit(event -> (event.getTableView(). getItems().get(event.getTablePosition().getRow())). setPhone(event.getNewValue())); txtStatus = new Text(); VBox vbox = new VBox(20); vbox.setPadding(new Insets(20, 20, 20, 20));; vbox.getChildren().addAll(hb, table, txtStatus); // W x H Scene scene = new Scene(vbox, 450, 375); primaryStage.setScene(scene); primaryStage.show(); table.getSelectionModel().select(0); PhoneBook pb = table.getSelectionModel(). getSelectedItem(); txtStatus.setText(pb.toString()); } private class RowChangeHandler implements ChangeListener { @Override public void changed(ObservableValue ov, Object oldVal, Object newVal) { int val = ((Number)newVal).intValue(); if (data.size()<=0) { return; } PhoneBook pb= (PhoneBook) data.get(val); txtStatus.setText(pb.toString()); } } public ObservableList<PhoneBook> dummyData() { ObservableList<PhoneBook> records = FXCollections.observableArrayList(); records.add(new PhoneBook("Mickey Mouse", "7894561230")); records.add(new PhoneBook("Donald Duck", "1234567890")); records.add(new PhoneBook("Alladin", "7418529630")); records.add(new PhoneBook("Zairo", "9638527410")); records.add(new PhoneBook("Batman", "7894561230")); records.add(new PhoneBook("Spiderman", "852478930")); return records; } public static void main(String [] args) { Application.launch(args); } }
Utdata
Figur 2: En post extraherad från tabellen
Slutsats
TableView komponenten är ganska användbar i UI-design, speciellt när vi gör databasprogrammering. JavaFX har gjort den här komponenten mångsidig även om det finns några brister i att implementera komplexa tabellrepresentationer. Naturligtvis är användbarheten som visas här bara en repa. Mer kan åstadkommas med TableView , som vi kommer att se i framtida artiklar.