- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 javafx 创建一个 ListView 并允许用户添加、 check out 、检入和删除 ListView 的元素。但是,当删除一个元素并将另一个元素放入其位置时,程序的行为就好像已删除的元素仍然存在,因此如果我尝试 checkout 新添加的元素,它会 checkout 我刚刚尝试的元素删除。
简单来说,发生的事情是这样的:
添加-->“项目 1”
添加-->“项目 2”
删除 -->“项目 1”(项目 1 现已删除,项目 2 在 ViewList 中向上移动)
checkout -->“项目 2”(出现提示,允许用户说明该项目的 checkout 对象及其 checkout 日期)
用户填写信息后,该行现在显示“项目 1 已于“日期” checkout 至“姓名”。”
它应该说第 2 项而不是第 1 项,我不明白为什么要这样做。
LibraryGUI.java
import java.util.ArrayList;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.ChoiceBoxListCell;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class LibraryGUI extends Application implements EventHandler<ActionEvent> {
private Library lib = new Library();
private ObservableList<String> item = FXCollections.observableArrayList();
private ListView<String> items = new ListView<String>(item);
private ArrayList<String> titles = new ArrayList<String>();
private ArrayList<String> formats = new ArrayList<String>();
private String title, format, loanedTo, dateLoaned;
private Button add, checkOut, checkIn, delete, accept1, accept2, accept3, accept4, cancel1, cancel2, cancel3,
cancel4;
private TextField tf1, tf2, tf3, tf4;
private Stage stage1, stage2, stage3, stage4;
private int itemNum;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
LibraryGUI gui = new LibraryGUI();
primaryStage.setTitle("Personal Lending Library");
items.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
Scene scene = new Scene(gui.layout(), 325, 340);
primaryStage.setScene(scene);
primaryStage.show();
}
public Pane layout() {
add = new Button("Add");
add.setOnAction(this);
add.setLayoutX(5);
add.setLayoutY(310);
add.setPrefWidth(75);
checkOut = new Button("Check Out");
checkOut.setOnAction(this);
checkOut.setLayoutX(85);
checkOut.setLayoutY(310);
checkOut.setPrefWidth(75);
checkIn = new Button("Check In");
checkIn.setOnAction(this);
checkIn.setLayoutX(165);
checkIn.setLayoutY(310);
checkIn.setPrefWidth(75);
delete = new Button("Delete");
delete.setOnAction(this);
delete.setLayoutX(245);
delete.setLayoutY(310);
delete.setPrefWidth(75);
Pane layout = new Pane();
items.setItems(item);
items.setCellFactory(ChoiceBoxListCell.forListView(item));
items.setLayoutX(5);
items.setLayoutY(5);
items.setPrefWidth(315);
items.setPrefHeight(300);
layout.getChildren().addAll(items, add, checkOut, checkIn, delete);
return layout;
}
@Override
public void handle(ActionEvent event) {
if (event.getSource() == add) {
accept1 = new Button("Accept");
accept1.setPrefWidth(70);
accept1.setLayoutX(125);
accept1.setLayoutY(65);
accept1.setOnAction(this);
cancel1 = new Button("Cancel");
cancel1.setPrefWidth(70);
cancel1.setLayoutX(205);
cancel1.setLayoutY(65);
cancel1.setOnAction(this);
Text dialog = new Text("Media Item Name:");
dialog.setLayoutX(20);
dialog.setLayoutY(45);
tf1 = new TextField();
tf1.setPrefHeight(20);
tf1.setPrefWidth(150);
tf1.setLayoutX(125);
tf1.setLayoutY(30);
Pane layout1 = new Pane();
layout1.getChildren().addAll(tf1, dialog, accept1, cancel1);
stage1 = new Stage();
stage1.setTitle("Item Name");
stage1.setScene(new Scene(layout1, 400, 100));
stage1.show();
}
if (event.getSource() == cancel1) {
stage1.close();
}
if (event.getSource() == accept1) {
title = tf1.getText();
titles.add(tf1.getText());
stage1.close();
accept2 = new Button("Accept");
accept2.setPrefWidth(70);
accept2.setLayoutX(125);
accept2.setLayoutY(65);
accept2.setOnAction(this);
cancel2 = new Button("Cancel");
cancel2.setPrefWidth(70);
cancel2.setLayoutX(205);
cancel2.setLayoutY(65);
cancel2.setOnAction(this);
Text dialog = new Text("Media Item Format:");
dialog.setLayoutX(15);
dialog.setLayoutY(45);
tf2 = new TextField();
tf2.setPrefHeight(20);
tf2.setPrefWidth(150);
tf2.setLayoutX(125);
tf2.setLayoutY(30);
format = tf2.getText();
Pane layout2 = new Pane();
layout2.getChildren().addAll(tf2, dialog, accept2, cancel2);
stage2 = new Stage();
stage2.setTitle("Item Format");
stage2.setScene(new Scene(layout2, 400, 100));
stage2.show();
}
if (event.getSource() == cancel2) {
title = null;
titles.remove(titles.size() - 1);
stage2.close();
}
if (event.getSource() == accept2) {
format = tf2.getText();
formats.add(tf2.getText());
lib.addNewItem(title, format);
items.getItems().add(title + " (" + format + ")");
stage2.close();
}
if (event.getSource() == checkOut) { //item is being checked out
item = items.getSelectionModel().getSelectedItems();
for (int i = 0; i < items.getItems().size(); i++) {
if (items.getSelectionModel().getSelectedItem()
.equals(lib.getItemList().get(i).getTitle() + " (" + lib.getItemList().get(i).getFormat() + ")")
&& !lib.getItemList().get(i).onLoan) {
itemNum = i;
accept3 = new Button("Accept");
accept3.setPrefWidth(70);
accept3.setLayoutX(125);
accept3.setLayoutY(65);
accept3.setOnAction(this);
cancel3 = new Button("Cancel");
cancel3.setPrefWidth(70);
cancel3.setLayoutX(205);
cancel3.setLayoutY(65);
cancel3.setOnAction(this);
Text dialog = new Text("Loaned To:");
dialog.setLayoutX(60);
dialog.setLayoutY(45);
tf3 = new TextField();
tf3.setPrefHeight(20);
tf3.setPrefWidth(150);
tf3.setLayoutX(125);
tf3.setLayoutY(30);
Pane layout3 = new Pane();
layout3.getChildren().addAll(accept3, cancel3, dialog, tf3);
stage3 = new Stage();
stage3.setTitle("Check Out");
stage3.setScene(new Scene(layout3, 400, 100));
stage3.show();
}
}
}
if (event.getSource() == accept3) {
loanedTo = tf3.getText();
lib.getItemList().get(itemNum).loanedTo = loanedTo;
stage3.close();
accept4 = new Button("Accept");
accept4.setPrefWidth(70);
accept4.setLayoutX(125);
accept4.setLayoutY(65);
accept4.setOnAction(this);
cancel4 = new Button("Cancel");
cancel4.setPrefWidth(70);
cancel4.setLayoutX(205);
cancel4.setLayoutY(65);
cancel4.setOnAction(this);
Text dialog = new Text("Date Loaned:");
dialog.setLayoutX(50);
dialog.setLayoutY(45);
tf4 = new TextField();
tf4.setPrefHeight(20);
tf4.setPrefWidth(150);
tf4.setLayoutX(125);
tf4.setLayoutY(30);
Pane layout3 = new Pane();
layout3.getChildren().addAll(accept4, cancel4, dialog, tf4);
stage4 = new Stage();
stage4.setTitle("Check Out");
stage4.setScene(new Scene(layout3, 400, 100));
stage4.show();
}
if (event.getSource() == accept4) {
stage4.close();
dateLoaned = tf4.getText();
lib.getItemList().get(items.getSelectionModel().getSelectedIndex()).dateLoaned = dateLoaned;
lib.getItemList().get(items.getSelectionModel().getSelectedIndex()).onLoan = true;
items.getItems().set(items.getSelectionModel().getSelectedIndex(),
titles.get(items.getSelectionModel().getSelectedIndex()) + " ("
+ formats.get(items.getSelectionModel().getSelectedIndex()) + ") loaned to " + loanedTo
+ " on " + dateLoaned);
}
if (event.getSource() == checkIn) {
for (int i = 0; i < items.getItems().size(); i++) {
if (items.getSelectionModel().getSelectedItem().contains(lib.getItemList().get(i).getTitle())
&& items.getSelectionModel().getSelectedItem().contains(lib.getItemList().get(i).getFormat())
&& lib.getItemList().get(i).onLoan) {
itemNum = i;
items.getItems().set(items.getSelectionModel().getSelectedIndex(),
titles.get(items.getSelectionModel().getSelectedIndex()) + " ("
+ formats.get(items.getSelectionModel().getSelectedIndex()) + ")");
lib.getItemList().get(items.getSelectionModel().getSelectedIndex()).dateLoaned = null;
lib.getItemList().get(items.getSelectionModel().getSelectedIndex()).onLoan = false;
}
}
}
if (event.getSource() == delete) { //item is being deleted from all lists
items.getItems().remove(items.getSelectionModel().getSelectedIndex());
for (int i = 0; i < items.getItems().size(); i++) {
if (items.getSelectionModel().getSelectedItem().contains(lib.getItemList().get(i).getTitle())
&& items.getSelectionModel().getSelectedItem().contains(lib.getItemList().get(i).getFormat())) {
itemNum = i;
lib.getItemList().remove(items.getSelectionModel().getSelectedIndex());
items.getItems().remove(items.getSelectionModel().getSelectedIndex());
titles.remove(items.getSelectionModel().getSelectedIndex());
formats.remove(items.getSelectionModel().getSelectedIndex());
}
}
}
}
}
库.java
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
public class Library {
private ObservableList<MediaItem> item = FXCollections.observableArrayList();
public ObservableList<MediaItem> getItemList() {
return item;
}
void addNewItem(String title, String format) {
item.add(new MediaItem(title, format));
}
我最近才开始使用 Java 编程,所以我的代码很可能还没有完全优化。任何和所有的帮助将不胜感激。谢谢。
最佳答案
这不是一个完整的答案,因为我没有运行你的代码,但看了它我给你一些建议。
首先,让整个类都是一个 ActionEvent 并且只有一个“handle”方法可能并不理想。我会将该句柄方法拆分为单独的方法,命名如下 public void handleAdd(ActionEvent event)
并将它们添加到您的按钮中,如下所示 add.setOnAction((ActionEvent e) -> handleAdd (e));
。这更有意义,因为每个按钮都有一个与其关联的特定操作,并且该操作包含在特定方法中。
其次,您是否需要四个列表和一个 Library 对象(它看起来只是另一个列表的包装器)?您试图使五个不同的列表彼此保持同步,这必然会导致像您现在看到的那样的问题,并且会让您或将来必须阅读和维护代码的人感到头疼。考虑只让您的 Library 并使您的 ListView 使用类型 MediaItem
而不是 String
,并将可借用的 to 和 dateloaned 添加为 MediaItem
的属性,假设这是一个你自己写的类。您仍然可以通过设置单元工厂来在 ListView 中正确显示标题,如下所示:
items.setCellFactory(new Callback<ListView<MediaItem>, ListCell<MediaItem>>() {
@Override
public ListCell<MediaItem> call(ListView<MediaItem> param) {
return new ListCell<MediaItem>() {
@Override
protected void updateItem(MediaItem item, boolean empty) {
super.updateItem(item, empty);
if(item != null) {
setText(item.getTitle());
}else{
setText("");
}
}
};
}
});
关于java - 为什么从 ListView 和相应的 ObservableList 中删除项目后数据仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47657241/
SELECT *, `o_cheque_request.member_id`, `o_cheque_request.wallet_id` FROM `o_cheque_request`, `o_mem
根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要**SELECT count(*)**呢? 无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如
我试图找出一个文件是否存在,如果存在,验证css样式是否已经存在,如果不存在,将它们写在文件末尾... 我已经完成了这一切,但分 3 个步骤: 该文件是否存在? FileInfo fi= new Fi
我们正在开发即时消息传递应用程序,并且需要在用户的化身上用绿点显示用户 friend 的“状态”。 “状态”远远超出了“my_app_is_opened_and_on_focus”,这意味着(我猜可能
模式 Movie(title, year, director, budget, earnings) Actor(stagename, realname, birthyear) ActedIn(stag
我有一个正在尝试创建的 MySQL 触发器,但无法获得正确的语法。 触发器应该遍历一组关键字并将其与插入数据库的新帖子的标题进行匹配。如果找到匹配项,它应该将新帖子分配给该存储桶并更新存储桶的关键字集
我有 3 个表......用户、更新和碰撞。 我想向发出 api 请求的用户返回最新订单的 feed 更新,并提供显示 feed 中每个状态所需的所有数据。我还需要包括更新是否已被发出 api 请求的
我正在尝试呈现一个带有 UIView 的 UIViewController。 以下是我在 viewDidLoad 方法中尝试的代码。 //create the view controller UIVi
我正在努力弄清楚如何在不对 mysql 进行两次调用的情况下从一个表中检查两件事。 我有一个 Members 表。我想测试MemberID 列中是否存在某个值,以及PhoneNumber 列中是否存在
以下代码给出了一个没有 Do Compile 错误的循环: Loop Sheets("Snap").Rows(1).AutoFilter Field:=5, Criteria1:=List
是否可以通过检查“dig”的输出来检查域名的存在? 在绑定(bind)源中,我发现了这些常量: 0 DNS_R_NOEROR 1 DNS_R_FORMERR 2 DNS_R_SERVFAIL 3 DN
Controller 有问题 我在 Windows 上使用服务器,一切正常,但在互联网上我试图访问页面 social_apartament/beauty_life/并且找不到该页面,代码错误 404这
/** This is struct S. */ struct S(T) { static if(isFloatingPoint!T) { /// This version works
JVM 类型删除如何帮助 Clojure?没有它,Clojure 还能存在吗?如果 JVM 有具体化的类型会发生什么?也就是说,Clojure 将如何改变? 最佳答案 Clojure 根本不会有太大变
许多论文等提到对“system()”的调用是不安全且不可移植的。我不反对他们的论点。 不过,我注意到许多 Unix 实用程序都有一个等效的 C 库。如果没有,源可用于各种这些工具。 虽然许多论文和此类
在我的 Node js 应用程序中,我有一个用户登录 api。上面我在服务器端代码中创建了一个名为 customerid 的变量。现在,当用户身份验证成功时。我将他的 userid 值存储在我的 cu
我有一个工作资源管理器组,由 Ubuntu 14.04 虚拟机、网络接口(interface)、公共(public) IP 地址和存储帐户组成。我已经从这组资源中创建了一个模板。 当我尝试部署这组资源
我有一个函数createminor4(arr,锦标赛)它基本上将arr分成4组,每组8人,然后将它们一次交换到tourney 1组。从那里它插入四个{},其中有 4 个带有空数组的键。 我已经在 Ch
我有一个图表,其中有两个图例。我需要更改其中一个图例的点的大小。 我需要更改图例中“市场类型”的项目符号大小。我使用示例 here但不适用于我的图表。 我的代码如下: k <- ggplot(subs
我有 fiddle here展示我正在尝试做的事情。 我有一个动态生成的表,因此列可以按用户选择的任何顺序显示。因此,我尝试获取两个特定 header 的索引,以便可以将 CSS 类添加到这两列以供稍
我是一名优秀的程序员,十分优秀!