javafx-TableView 作为组合框弹出窗口(尝试并能够部分实现。需要进一步帮助)

2024-03-05

我需要的:

  1. 需要一个可编辑的组合框,它可以在键入时过滤弹出窗口上的数据,并且第一个匹配的项目应突出显示,并应在按 Enter 键时设置为组合中的文本。
  2. 弹出窗口应该是一个包含 2 或 3 列的表格视图。 (附有屏幕截图。)(在图像中,它是一个文本字段,但我更喜欢组合,这样如果用户不确定这些值,他可以单击组合按钮并查看整个列表并选择一个。)

我将把一些数据作为源绑定到表视图,该表视图应充当组合框的弹出窗口。 我知道我应该选择自定义控件,但不知道从哪里开始?

参考网址:在此输入链接描述 https://youtu.be/DvXp_7_Wx9U

提前致谢。

到目前为止我已经尝试过:

Guys,

根据你们提供的想法,到目前为止我已经尝试过并且能够实现。 (目前,我没有在文本字段下方动态显示表格视图(最终是我想要的)) 1. 带有静态数据的表格视图已加载并添加到场景中。 2. 在表格视图下方有一个文本字段。 (这被命名为txt) 3. 在第一个文本字段下方有另一个文本字段(名为 txt1)(当我从上一个文本字段按 Tab 时,光标应该来到这里)

我为表设置了谓词,并且当用户在 txt 中键入时更新我的​​谓词。 (在职的) 能够过滤表格,第一个匹配的行将突出显示。 (在职的) 当用户按“Tab”或“Enter”时,表视图中突出显示的行应设置为txt中的值。(工作)

需要: 1. 当我按“Tab”或“Enter”时,突出显示的行将被设置为文本字段(txt)中的值,并且光标应移动到下一个可聚焦节点。就我而言,它是第二个文本字段(txt1)。我不想实时说 txt1.requestFocus() bcoz,我在场景中有很多文本字段,并且此控件将是用户控件。所以不能硬编码任何东西。

  1. 当用户在文本字段中键入一些文本(不是全文。例如:“do”,其中我的表包含“Dom”、“Don”)时,如果有多个匹配项,当前两条记录都会显示在表中,但是第一个将突出显示。如果用户愿意,应该能够通过按文本字段本身的向下箭头来选择第二行。

主程序.java

package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            VBox root = FXMLLoader.load(this.getClass().getResource("MainView.fxml"));
            Scene scene = new Scene(root,500,300);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

主控制器.java

package application;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;

import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Popup;

public class MainController implements Initializable
{
    private @FXML TableView<Person> table;
    private @FXML TableColumn<Person, String> firstNameCol;
    private @FXML TableColumn<Person, String> lastNameCol;
    private @FXML TableColumn<Person, String> emailCol;
    private @FXML TableColumn<Person, Integer> ageCol;
    private @FXML TextField txt;
    private @FXML TextField txt1;
    private @FXML Button btn;

    @Override
    public void initialize(URL location, ResourceBundle resources)
    {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                txt.requestFocus();
            }
        });

        ObservableList<Person> obsList =FXCollections.observableArrayList();
        obsList.add(new Person("Sam", "P1LasttName", "[email protected] /cdn-cgi/l/email-protection", 20));
        obsList.add(new Person("Dom", "P2LasttName", "[email protected] /cdn-cgi/l/email-protection", 30));
        obsList.add(new Person("Ken", "P3LasttName", "[email protected] /cdn-cgi/l/email-protection", 40));
        obsList.add(new Person("Don", "P4LasttName", "[email protected] /cdn-cgi/l/email-protection", 50));
        obsList.add(new Person("Tom", "P5LasttName", "[email protected] /cdn-cgi/l/email-protection", 60));


        FilteredList<Person> filteredList = new FilteredList<>(obsList, p->true);
        table.setItems(filteredList);

        txt.textProperty().addListener((obs, oldValue, newValue) ->{

            filteredList.setPredicate(person-> {
                if(newValue == null || newValue.isEmpty())
                    return true;
                if(person.getFirstName().trim().toLowerCase().contains(newValue.toLowerCase()))
                    return true;
                return false;
            });

            Platform.runLater(new Runnable() {
                @Override
                public void run()
                {
                    // we don't want repeated selections
                    table.getSelectionModel().clearSelection();
                    //get the focus
                    table.requestFocus();

                    //select first item in TableView model
                    table.getSelectionModel().selectFirst();

                    //set the focus on the first element
                    table.getFocusModel().focus(0);

                    //render the selected item in the TableView
                    //tableClickHandler(null);
                }
            });

            Platform.runLater(new Runnable() {
                @Override
                public void run()
                {
                    txt.requestFocus();
                    txt.end();
                }
            });

        });

        table.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event)
            {
                if(event.getCode() == KeyCode.ENTER)
                {
                    txt.setText(table.getSelectionModel().getSelectedItem().getFirstName());
                }
            }
        });

        txt.setOnKeyPressed(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event)
            {
                if(event.getCode() == KeyCode.ENTER || event.getCode() == KeyCode.TAB)
                //if(event.getCode() == KeyCode.ENTER)
                {
                    txt.setText(table.getSelectionModel().getSelectedItem().getFirstName());
                    /*Platform.runLater(new Runnable() {
                        public void run() {
                            txt1.requestFocus();
                        }
                    });*/
                }
            }
        });

        /*txt.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event)
            {
                if(event.getCode() == KeyCode.TAB)
                {
                    //txt.setText(table.getSelectionModel().getSelectedItem().getFirstName());
                    if(txt.getSkin() instanceof BehaviorSkinBase)
                    {
                        //((BehaviorSkinBase)txt.getSkin()).getBehavior().traverseNext();
                        BehaviorBase x = ((BehaviorSkinBase)txt.getSkin()).getBehavior();
                        ((TextFieldBehavior)x).callAction("TraverseNext");
                    }
                    event.consume();
                }
            }
        });*/

        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event)
            {
                /*
                Popup popup = new Popup();
                popup.getContent().add(new TableView());
                //popup.show(txt, txt.localToScreen(0, 0).getX() + txt.getWidth()/2, txt.localToScreen(0, 0).getY() + txt.getHeight());
                popup.show(txt, txt.localToScreen(0, 0).getX(), txt.localToScreen(0, 0).getY() + txt.getHeight() + 2);
                */
                Parent vbox = null;
                try {
                    vbox = FXMLLoader.load(this.getClass().getResource("TableView.fxml"));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Popup popup = new Popup();
                popup.getContent().add(vbox);
                //popup.show(txt, txt.localToScreen(0, 0).getX() + txt.getWidth()/2, txt.localToScreen(0, 0).getY() + txt.getHeight());
                //popup.show(txt, txt.localToScreen(0, 0).getX(), txt.localToScreen(0, 0).getY() + txt.getHeight() + 2);
                popup.show(txt, txt.localToScreen(0, 0).getX(), txt.localToScreen(0, 0).getY() + txt.getHeight() + 2);
            }
        });
    }
}

人.java

package application;

public class Person
{
    private String firstName;
    private String lastName;
    private String email;
    private Integer age;

    public Person(){}

    public Person(String firstName, String lastName, String email, Integer age)
    {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.age = age;
    }

    public String getFirstName()
    {
        return firstName;
    }

    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    public String getLastName()
    {
        return lastName;
    }

    public void setLastName(String lastName)
    {
        this.lastName = lastName;
    }

    public String getEmail()
    {
        return email;
    }

    public void setEmail(String email)
    {
        this.email = email;
    }

    public Integer getAge()
    {
        return age;
    }

    public void setAge(Integer age)
    {
        this.age = age;
    }
}

应用程序.css

.table-row-cell:selected
{
    -fx-background-color: lightgreen;
    /* the below style will remove the border lines of the selected row */
    -fx-table-cell-border-color: transparent;
}

主视图.fxml

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.VBox?>

<!-- <?import application.Person?> -->

<VBox spacing="10.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainController">
   <children>
      <TableView fx:id="table" prefHeight="250.0" prefWidth="437.0">
        <columns>
          <TableColumn fx:id="firstNameCol" prefWidth="120.0" text="First Name">
          <cellValueFactory><PropertyValueFactory property="firstName" /></cellValueFactory>
          </TableColumn>
          <TableColumn fx:id="lastNameCol" prefWidth="120.0" text="Last Name">
          <cellValueFactory><PropertyValueFactory property="lastName" /></cellValueFactory>
          </TableColumn>
            <TableColumn fx:id="emailCol" prefWidth="120.0" text="Email">
            <cellValueFactory><PropertyValueFactory property="email" /></cellValueFactory>
            </TableColumn>
            <TableColumn fx:id="ageCol" prefWidth="75.0" text="Age">
            <cellValueFactory><PropertyValueFactory property="age" /></cellValueFactory>
            </TableColumn>
        </columns>

      </TableView>
      <Button text="Button" fx:id="btn"/>
      <TextField fx:id="txt" promptText="Type to Filter" />
      <TextField fx:id="txt1" promptText="Focus should be here when tab is pressed from pervious txt" />
   </children>
   <padding>
      <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
   </padding>
</VBox>

表格视图.fxml

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

<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.VBox?>
<?import application.Person?>
<?import javafx.collections.*?>

<!--
<VBox xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65">
<children>
-->

      <!--  <TableView xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65" fx:id="table" prefHeight="160.0" prefWidth="440.0"> -->
      <TableView xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.65" fx:id="table" prefHeight="140.0">
        <columns>
          <TableColumn fx:id="firstNameCol" prefWidth="120.0" text="First Name">
          <cellValueFactory><PropertyValueFactory property="firstName" /></cellValueFactory>
          </TableColumn>
          <TableColumn fx:id="lastNameCol" prefWidth="120.0" text="Last Name">
          <cellValueFactory><PropertyValueFactory property="lastName" /></cellValueFactory>
          </TableColumn>
            <TableColumn fx:id="emailCol" prefWidth="120.0" text="Email">
            <cellValueFactory><PropertyValueFactory property="email" /></cellValueFactory>
            </TableColumn>
            <TableColumn fx:id="ageCol" prefWidth="75.0" text="Age">
            <cellValueFactory><PropertyValueFactory property="age" /></cellValueFactory>
            </TableColumn>
        </columns>

        <columnResizePolicy><TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /></columnResizePolicy>

        <items>
        <FXCollections fx:factory="observableArrayList">
        <Person firstName="P1FirstName" lastName="P1LasttName" email="[email protected] /cdn-cgi/l/email-protection" age="20"/>
        <Person firstName="P2FirstName" lastName="P2LasttName" email="[email protected] /cdn-cgi/l/email-protection" age="30"/>
        <Person firstName="P3FirstName" lastName="P3LasttName" email="[email protected] /cdn-cgi/l/email-protection" age="40"/>
        <Person firstName="P4FirstName" lastName="P4LasttName" email="[email protected] /cdn-cgi/l/email-protection" age="50"/>
        <Person firstName="P5FirstName" lastName="P5LasttName" email="[email protected] /cdn-cgi/l/email-protection" age="60"/>
        </FXCollections>
        </items>

      </TableView>
<!--
</children>
</VBox>
-->

任何帮助表示赞赏。谢谢!


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javafx-TableView 作为组合框弹出窗口(尝试并能够部分实现。需要进一步帮助) 的相关文章

随机推荐

  • Symfony 4 - 不渲染 Twig 模板

    当尝试在 Symfony 4 项目中渲染 Twig 模板时 我收到错误 我不知道是哪个问题 这是生成错误的代码 return this gt render templates imagenes index html twig 这是我收到的错
  • android - 你是否需要将片段添加到清单中

    我使用一个应该显示网络视图的片段 当我尝试从使用它的类实例化它时 我在 logcat 中收到以下警告 02 21 23 26 46 843 W System err 32468 android content ActivityNotFoun
  • 不重复的随机数

    我需要生成大约 9 1 亿个不重复的随机数 范围从零到生成的数字数量 并且我需要它们非常快速地生成 对类似问题的几个答案提出了简单地对数组进行洗牌以获得随机数 而其他答案则提出使用布隆过滤器 问题是 哪一个更有效 如果是布隆过滤器 我该如何
  • 使用应用程序加载器上传 IPA

    我有一个 IPA 并想上传它应用加载器 但是当我在应用程序加载器中单击 打开包 时 我无法选择 IPA 文件 它呈灰色 如何使用应用程序加载器将此 IPA 文件上传到 iTunes Connect 单击 打开包 按钮是错误的 请改用 交付您
  • jvm重排序/可见性效果测试

    在写一些java文章时我试图重现重新排序 http www cs umd edu pugh java memoryModel jsr 133 faq html reordering多线程环境中对象构造不同步的情况 当一个重对象被构造而没有同
  • 如何在WPF中设置可调整字体大小的文本块或标签?

    在WPF中 如果我将任何控件放入网格中 如果我调整网格大小 它会自动调整其中所有控件的大小 但是在标签或文本块或任何其他文本元素中 所有控件大小都会改变 但字体大小保持不变 它不会改变 如果字体必须根据网格大小进行更改 应该怎么办 您可以通
  • mysql相关字段

    这4个字段是相互关联的 I want it to output it as In my query SELECT users firstname users lastname users screenname posts post id p
  • PHP:从关联数组中删除重复值并返回包含重复值的关联数组

    我有如下所示的关联数组 arr 1 gt 0 2 gt 1 3 gt 1 4 gt 2 我想从初始数组中删除重复值并将这些重复值作为新数组返回 所以我最终会得到类似的东西 arr 1 gt 0 4 gt 2 new arr 2 gt 1 3
  • 如何修复 React Native 中的“translatex 键的转换必须是数字”错误?

    我正在尝试在 React Native 中制作翻译动画 这是我的代码 const scrollX React useRef new Animated Value 0 current
  • git:克隆没有引入所有文件?

    我刚刚创建了名为的目录website 这有几个图像 index html 页面等 我跑了 git bare init shared 0777 现在 它成功创建了一个空的共享存储库 我现在尝试通过进入来克隆这个项目 developers de
  • 如何检测WP8中是否正在播放背景音乐?

    如果有人开发过 WP 应用 你就会知道 如果你的应用在未经用户同意的情况下停止当前正在播放的音乐 你就无法通过认证 我确实看到了这个问题here https stackoverflow com questions 7034205 how t
  • Jquery日期比较

    您好 我使用以下代码将输入的日期与当前日期进行比较 但它不起作用 change function var date val var arrDate date split var today new Date var useDate new
  • Android:有没有办法获取国家/地区名称的时区?

    有没有办法让时区指定国家 地区名称 我用getCountryName 在地图中获取国家 地区的名称 考虑到一些国家跨越多个时区 这似乎很困难
  • 如何立即查看IntelliJ Idea项目树中的编译错误?

    我想知道是否可以配置 IntelliJ Idea 以立即显示项目树中的类文件的编译错误 目前 如果无法编译类 我需要手动触发重新编译以查看类上的错误标记 从 IntelliJ 12 开始 有一个选项可以根据源代码更改自动构建项目 在 设置
  • 在powershell中将字符串转换为日期时间

    我正在尝试使用以下行解析文件名 字符串 并将它们转换为 powershell 中的日期 datetime ParseExact DirName BaseName yyyyMMdd null 问题是 并非该目录中的所有文件夹都遵循该命名约定
  • Pytesseract 对于实时 OCR 来说非常慢,有什么方法可以优化我的代码吗?

    我正在尝试使用 python 创建实时 OCRmss and pytesseract 到目前为止 我已经能够捕获整个屏幕 其 FPS 稳定为 30 如果我想捕获大约 500x500 的较小区域 我已经能够获得 100 FPS 然而 一旦我包
  • Laravel 5 路由前缀

    我想要一条以国家 地区为前缀的路线 像这样 us shop ca shop fr shop 我的想法是这样做
  • 排列未排序

    我知道一种算法 可以在网上找到 对排列进行排名 即给定一个排列 将整数索引返回到按字典顺序排序的排列列表中 但我不知道unrank执行相反操作的算法 给定索引 i 返回按字典顺序排列的第 i 个排列 由于我找不到任何内容 有人可以透露一些信
  • IIS Web.Config 301 重定向查询字符串参数 (?)

  • javafx-TableView 作为组合框弹出窗口(尝试并能够部分实现。需要进一步帮助)

    我需要的 需要一个可编辑的组合框 它可以在键入时过滤弹出窗口上的数据 并且第一个匹配的项目应突出显示 并应在按 Enter 键时设置为组合中的文本 弹出窗口应该是一个包含 2 或 3 列的表格视图 附有屏幕截图 在图像中 它是一个文本字段