Я бы использовал FilteredList
в этом случае. Это позволит вам создать «подсписок» из исходного списка. В этой демонстрации я создаю поле типа в классе Service
. Затем я фильтрую исходный список на основе «типа». Вам не нужно создавать поле типа, но вам нужно будет найти что-то для фильтрации, если вы этого не сделаете.
Main:
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXApplication184 extends Application
{
@Override
public void start(Stage stage) throws Exception
{
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}
Контроллер:
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import java.util.function.Predicate;
import javafx.collections.FXCollections;
import javafx.collections.transformation.FilteredList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TabPane;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
/**
*
* @author blj0011
*/
public class FXMLDocumentController implements Initializable
{
@FXML
private TabPane tpMain;
@FXML
private TableView<Service> tvTab1, tvTab2;
@FXML
private TableColumn<Service, String> tcServiceNameTab1, tcServicePriceTab1, tcServiceDurationTab1;
@FXML
private TableColumn<Service, String> tcServiceNameTab2, tcServicePriceTab2, tcServiceDurationTab2;
@FXML
private void handleButtonAction(ActionEvent event)
{
System.out.println("You clicked me!");
}
@Override
public void initialize(URL url, ResourceBundle rb)
{
tcServiceNameTab1.setCellValueFactory(new PropertyValueFactory("name"));
tcServicePriceTab1.setCellValueFactory(new PropertyValueFactory("price"));
tcServiceDurationTab1.setCellValueFactory(new PropertyValueFactory("duration"));
tcServiceNameTab2.setCellValueFactory(new PropertyValueFactory("name"));
tcServicePriceTab2.setCellValueFactory(new PropertyValueFactory("price"));
tcServiceDurationTab2.setCellValueFactory(new PropertyValueFactory("duration"));
//Add sanoke data
List<Service> services = new ArrayList();
services.add(new Service("Manicure 1", "40.0", "60", "Manicure"));
services.add(new Service("Manicure 2", "40.0", "60", "Manicure"));
services.add(new Service("Pedicure 1", "40.0", "60", "Pedicure"));
services.add(new Service("Pedicure 2", "40.0", "60", "Pedicure"));
FilteredList<Service> flTab1 = new FilteredList(FXCollections.observableArrayList(services), getManicures());
FilteredList<Service> flTab2 = new FilteredList(FXCollections.observableArrayList(services), getPedicures());
tvTab1.setItems(flTab1);
tvTab2.setItems(flTab2);
}
Predicate<Service> getManicures()
{
return p -> p.getType().equals("Manicure");
}
Predicate<Service> getPedicures()
{
return p -> p.getType().equals("Pedicure");
}
}
FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" prefHeight="406.0" prefWidth="369.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.141" fx:controller="javafxapplication184.FXMLDocumentController">
<children>
<TabPane fx:id="tpMain" layoutX="56.0" layoutY="67.0" prefHeight="200.0" prefWidth="200.0" tabClosingPolicy="UNAVAILABLE" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<tabs>
<Tab text="Manicure">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<TableView fx:id="tvTab1" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn fx:id="tcServiceNameTab1" prefWidth="75.0" text="Service" />
<TableColumn fx:id="tcServicePriceTab1" prefWidth="75.0" text="Price" />
<TableColumn fx:id="tcServiceDurationTab1" prefWidth="75.0" text="Duration" />
</columns>
</TableView>
</children>
</AnchorPane>
</content>
</Tab>
<Tab text="Pedicure">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0">
<children>
<TableView fx:id="tvTab2" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn fx:id="tcServiceNameTab2" prefWidth="75.0" text="Service" />
<TableColumn fx:id="tcServicePriceTab2" prefWidth="75.0" text="Price" />
<TableColumn fx:id="tcServiceDurationTab2" prefWidth="75.0" text="Duration" />
</columns>
</TableView>
</children>
</AnchorPane>
</content>
</Tab>
</tabs>
</TabPane>
</children>
</AnchorPane>
Услуги:
/**
*
* @author blj0011
*/
public class Service
{
private String name;
private String price;
private String duration;
private String type;
public Service(String name, String price, String duration, String type)
{
this.name = name;
this.price = price;
this.duration = duration;
this.type = type;
}
/**
* @return the name
*/
public String getName()
{
return name;
}
/**
* @param name the name to set
*/
public void setName(String name)
{
this.name = name;
}
/**
* @return the price
*/
public String getPrice()
{
return price;
}
/**
* @param price the price to set
*/
public void setPrice(String price)
{
this.price = price;
}
/**
* @return the duration
*/
public String getDuration()
{
return duration;
}
/**
* @param duration the duration to set
*/
public void setDuration(String duration)
{
this.duration = duration;
}
/**
* @return the type
*/
public String getType()
{
return type;
}
/**
* @param type the type to set
*/
public void setType(String type)
{
this.type = type;
}
}