当前位置: 首页 > 知识库问答 >
问题:

Javafx SceneBuilder TableView.GetSelectionModel不工作

利俊迈
2023-03-14

TableView.GetSelectionModel不工作。在通知表单@james_d之后,我使用了一个模型类(软件)来选择我需要的列,同时将SQL拉到一个TableView。我在这里搜索了一下,浏览了网页,移动了代码,检查了intellisense,我能在任何地方找到的最好的示例都在下面的SoftwareController代码中注释掉了,什么都不起作用?

public class SoftwareController extends Application implements Initializable {
private Statement statement;
Connection conn = null;
@FXML Button  btnSoftware;
@FXML Label lblTest;
@FXML TableView tblSoftware;
@FXML TableColumn CI_IDcol;
@FXML TableColumn Namecol;

public static void main(String[] args) {

    launch(args);

}

@Override
public void start(Stage primaryStage) throws Exception {


    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/Software.fxml")); //load Software fxml file
    Parent root1 = (Parent) fxmlLoader.load();
    primaryStage.setScene(new Scene(root1));
    primaryStage.show();

}

private static ObservableList<Software>data;
@FXML   private TextField txtFilter;
private Object getCellData;

@SuppressWarnings({ "unchecked", "rawtypes" })  //added due to TableView getselecionModel code
@Override
public void initialize(URL location, ResourceBundle resources)  {

    try {

        data = FXCollections.observableArrayList();
        conn = DBconnection.makeConnection();
        statement = conn.createStatement();
        String SQL = "SELECT * FROM Data_CMDB_Main";
        ResultSet rs = statement.executeQuery(SQL);

        while (rs.next())   {
            data.add(new Software(rs.getString("CI_ID"),
                                  rs.getString("Name")));

            CI_IDcol.setCellValueFactory(new PropertyValueFactory("CI_ID"));
            Namecol.setCellValueFactory(new PropertyValueFactory("Name"));
            tblSoftware.setItems(null);
            tblSoftware.setItems(data);

//TableView.selection               
            //get row example 1
            /*tblSoftware.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
            @Override
            public void changed(ObservableValue observableValue, Object oldValue, Object newValue) {
                if(tblSoftware.getSelectionModel().getSelectedItem() != null) {
                    TableViewSelectionModel selectionModel = tblSoftware.getSelectionModel();
                    ObservableList selectedCells = selectionModel.getSelectedCells();
                    TablePosition tablePosition = (TablePosition) selectedCells.get(0);
                    Object val = tablePosition.getTableColumn().getCellData(newValue);
                    //Object val = tblSoftware.getColumns().get(0).toString();
                    System.out.println(val);                    //int row = tablePosition.getRow();

                }                       
                }
            });*/


            //get row example 2   only gives index of filtered rows
            //tblSoftware.getSelectionModel().selectedIndexProperty().addListener((v, oldValue, newValue) -> System.out.println(newValue)); //gets all row data

            //get row example 3 ItemProperty seems correct just not giving readable row identification
            //tblSoftware.getSelectionModel().selectedItemProperty().addListener((v, oldValue, newValue) -> System.out.println(newValue)); //gets all row data


            ///get row example 4
            //@Override
            /*tblSoftware.getSelectionModel().selectedItemProperty().addListener( //gets any row column
                    (observable, oldValue, newValue) -> {
                        if (newValue == null) {
                            lblTest.setText("");
                            return;
                        }

                        lblTest.setText("Selected Number: " + newValue.get(0)); 
                    }
                );*/

            ///get row example 5

            /*tblSoftware.getSelectionModel().selectedItemProperty().addListener( //gets any row column
                    new ChangeListener<IdentifiedName>() {
                        @Override
                        public void changed (
                            ObservableValue<? extends IdentifiedName> observable,
                            IdentifiedName oldValue,
                            IdentifiedName newValue
                        ){
                            if(newValue == null) {
                                lblTest.setText("");
                                return;
                            }

                        lblTest.setText("Selected Number: " + + newValue.getId(0));

                }
            }   
     );             */



//filter        
            txtFilter.setPromptText("Text Filter");
            txtFilter.textProperty().addListener(new InvalidationListener() {

                @Override
                public void invalidated(Observable o)   {
                    tblSoftware.getSelectionModel().clearSelection(); // this gives no errors when switching back to filter box when row previously selected
                    if(txtFilter.textProperty().get().isEmpty())    {
                        tblSoftware.setItems(data);
                        return;
                    }
                    ObservableList<Software> tableItems = FXCollections.observableArrayList();
                    ObservableList<TableColumn<Software, ?>> cols = tblSoftware.getColumns();
                    for(int i=0; i<data.size(); i++)    {

                    for(int j=0; j<cols.size(); j++)    {
                        TableColumn col = cols.get(j);
                        String cellValue = col.getCellData(data.get(i)).toString();
                        cellValue = cellValue.toLowerCase();
                        if(cellValue.contains(txtFilter.textProperty().get().toLowerCase()))    {
                            tableItems.add(data.get(i));
                            break;                  
                        }
                    }

                    } 
                    tblSoftware.setItems(tableItems);
                }
            });
        }               

    } catch (SQLException e) {

        e.printStackTrace();
    }

}


protected void setIndex(int selectedIndex) {
    // TODO Auto-generated method stub

}

public void btnSoftwarePressed(){
    lblTest.setText("Button works");


}
}

软件类

 package fxml;
 import javafx.beans.property.SimpleStringProperty;
 import javafx.beans.property.StringProperty;


public class Software {

    private StringProperty CI_ID;
    private StringProperty Name;

    public Software(String CI_ID, String Name)  {
        this.CI_ID = new SimpleStringProperty(CI_ID);
        this.Name = new SimpleStringProperty(Name);
    }

    public StringProperty CI_IDProperty()   {
        return CI_ID;
    }

    public StringProperty NameProperty()    {
        return Name;
    }
}

软件fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import java .util.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxml.SoftwareController">
   <center>
      <TableView fx:id="tblSoftware" prefHeight="200.0" prefWidth="600.0" BorderPane.alignment="CENTER">
        <columns>
          <TableColumn fx:id="CI_IDcol" prefWidth="100.0" text="CI_ID" />
          <TableColumn fx:id="Namecol" prefWidth="150.0" text="Name" />
        </columns>
      </TableView>
   </center>
   <top>
      <VBox prefHeight="83.0" prefWidth="600.0" BorderPane.alignment="CENTER">
         <children>
            <HBox prefHeight="100.0" prefWidth="200.0">
               <children>
                  <Button fx:id="btnSoftware" mnemonicParsing="false" onAction="#btnSoftwarePressed" text="Button" />
                  <Label fx:id="lblTest" prefHeight="28.0" prefWidth="158.0" text="Label" />
                  <ParallelCamera />
               </children>
            </HBox>
            <HBox>
               <children>
                  <TextField fx:id="txtFilter" />
               </children>
            </HBox>
         </children>
      </VBox>
   </top>
</BorderPane>

共有1个答案

郁博学
2023-03-14

我不太确定您到底想要做什么,但我可以给出我的方法,将数据从db插入到tableview中,然后使用加载到tableview中的前一个数据从db获取数据。

我首先在控制器内部创建了一个内部类,它将表示要保存到数据库中/从数据库中加载的实例:

public static class Detector {
    private String name;
    private String conn_type;
    private int num_detect;
    private String serial_port;
    private int data_bits;
    private int stop_bits;
    private String parity;
    private String ip;
    private int eth_port;
    private int historic;

    public Detector(String name, String conn_type, int num_detect, String serial_port, int speed,
        int data_bits, int stop_bits, String parity, String ip, int eth_port, int his){

        this.name = name;
        this.conn_type = conn_type;
        this.num_detect = num_detect;
        this.serial_port = serial_port;
        this.data_bits = data_bits;
        this.stop_bits = stop_bits;
        this.parity = parity;
        this.ip = ip;
        this.eth_port = eth_port;
        this.historic = his;
    }
}

在此之后,我声明了tableview

public class Controller implements Initializable {
   @FXML
   private TableView<Detector> detectors; 
   .
   .
   .

并使用从查询获得的数据创建了tableview:

    DBConnection c = new DBConnection();
    c.connect();
    try{
        String sql = "select * from detector order by name";
        ResultSet rs = c.query(sql);

        ObservableList<Detector> data = FXCollections.observableArrayList();
        while(rs.next()){               
            data.add(new Detector(rs.getString("name"),
                                    rs.getString("conn_type"),                                     
                                    Integer.parseInt(rs.getString("num_detect")),
                                    rs.getString("serial_port"),
                                    Integer.parseInt(rs.getString("speed")),
                                    Integer.parseInt(rs.getString("data_bits")),
                                    Integer.parseInt(rs.getString("stop_bits")),
                                    rs.getString("parity"),
                                    rs.getString("ip"),
                                    Integer.parseInt(rs.getString("puerto_socket")),
                                    Integer.parseInt(rs.getString("historico"))
            ));
        }
        TableColumn colName = new TableColumn("Name");
        colName.setCellValueFactory(new PropertyValueFactory<Detector, String>("name"));
        detectors.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> loadName(newValue));
        detectors.setItems(data);
        detectors.getColumns().addAll(nombreCol);           
        //Add a column for every column data you want to show

然后,您必须定义侦听器调用的方法的行为(在我的例子中是“loadName”)

private void loadName(Detector r){
    //here you could, for example, generate a sql query with the data received in r
}
 类似资料:
  • 我想在菜单栏文本被选中时更改它的颜色。 这里可能出了什么问题? 我尝试使用伪类':active',但没有得到应用。其中as':Hover'正在工作。 我还尝试使用'Router LinkActive',它应该添加类'Active-Link',但这也不起作用。 我在下面给出了HTML、SCCS和TS代码:

  • 我编写了一组简单的类,向一位朋友演示如何为AOP(而不是xml配置)使用注释。我们无法使@ComponentScan工作,并且AnnotationConfigApplicationContext getBean的行为也不正常。我想明白两件事。请参阅下面的代码: PersonOperationSI.java PersonOperations.java PersonOperationsConfigCl

  • 我正在Eclipse Neon中使用Hibernate工具(JBoss tools 4.4.0.Final)。现在,我想将数据库表反向工程为POJO对象和Hibernate映射文件。 我遵循了一些关于如何设置Eclipse来生成POJO对象的教程。在我运行配置之前,一切看起来都很好。什么都没发生,也没有抛出错误。有人能帮我吗?数据库是一个微软SQL服务器2014。 我的逆向工程配置文件看起来像:

  • 我正在尝试使用codeigniter insert\u batch将多行插入到我的数据库表中。根据错误报告,似乎没有设置表列。只是阵列的数量: 我的看法是: 我的控制器: 和型号:

  • 我尝试使用StreamWriter.WriteLine(不是静态地)将几行代码一次写到。txt文件中。 每个播放器对象都是字符串cosnatants。如果我使用不同的文件名(也称为BasicTestInfo2.txt),它会在bin.debug中创建该文件,但它是空的。我知道我到达了using块的内部(我在里面放了一个console.writeline),我知道我想要截断,这就是为什么我对appe

  • 我正在尝试使用yii2邮件组件发送电子邮件。 配置web。php 还有我的代码。 我收到了这个错误。 Swift\u TransportException预期响应代码为250,但收到代码“535”,消息“535-5.7.8用户名和密码不被接受。有关详细信息,请访问535 5.7.8https://support.google.com/mail/?p=BadCredentialsa13-v6sm41

  • 问题内容: 似乎不起作用,但确实起作用。有什么想法吗? 问题答案: 您不能在Java中将基本类型用作通用参数。改为使用: 使用自动装箱/拆箱,代码几乎没有区别。自动装箱意味着您可以编写: 代替: 自动装箱意味着将第一个版本隐式转换为第二个版本。自动拆箱意味着您可以编写: 代替: 如果未找到键,则隐式调用意味着将生成一个,例如: 原因是类型擦除。例如,与C#不同,泛型类型不会在运行时保留。它们只是显