我们的下一个示例赢博体育程序是一个简单的GUI赢博体育程序,它实现了一个非常简单(而且非常不安全)的密码管理器。
密码管理器有三个部分。在屏幕的前三分之一,用户可以输入网站的用户名/密码组合。中间部分显示了用户存储了密码的赢博体育站点的列表。底部的三分之一允许用户查看他们从列表中选择的网站的用户名/密码组合。
密码数据存储在一个简单的文本文件中。单击Save按钮将更改保存回该文件。
这个赢博体育程序需要的第一个类是Site类,它存储我们想要使用的站点的用户名/密码组合。
包edu.lawrence.guipasswordmanager;进口java.io.PrintWriter;进口java.util.Scanner;站点的公共类{私有字符串名称;私有字符串用户;private String密码;public Site() {} public Site(字符串名称,字符串用户,字符串密码){this.name = name;这一点。User = User;这一点。Password = Password;}公共无效readFrom(扫描器输入){name = input.next();User = input.next();Password = input.next();}公共无效writeTo(printwwriter输出){output.println(名称);output.println(用户);output.println(密码);}公共字符串getName(){返回名称;}公共字符串getUser(){返回用户;}公共字符串getPassword(){返回密码;} @覆盖公共字符串toString(){返回名称;}}
我们赢博体育程序的GUI包括一个ListView组件,它将显示赢博体育程序管理的Site对象列表。JavaFX对我们想要在ListView中显示的数据有一个非常具体的要求:我们需要将这些数据放入一种称为可观察列表的特殊类型的列表中。可观察列表为普通列表添加了一个重要的新功能:当一个可观察列表的内容发生变化时,列表会将这些变化通知其他对象。通过将Site对象放入一个可观察列表中,然后将该列表交给ListView, ListView可以将自己设置为列表的观察者。当列表的内容发生变化时,列表将自动通知ListView。一旦ListView收到更改通知,它将自动重绘自己以显示新的列表内容。
ListViews的另一个重要方面是,用户可以单击它们来选择列表中的项。然后,我们可以要求ListView告诉我们用户选择了哪个对象。
我们需要注意的另一个需求是,ListView希望为其列表中存储的每个项目显示一些文本。为了获取该文本,ListView将调用object的toString()方法。
在下面的代码中,我们将看到如何在Java中实现这些特性。
在本例中,我们将使用FXML,这意味着我们将为窗口编写一个控制器类。
当我们编写用于处理数据的赢博体育程序时,我们通常会让赢博体育程序在启动时加载该数据。我们将使用的具体机制包括让控制器类实现一个特殊的Initializable接口,并覆盖该接口的initialize()方法。这样做将导致FXML在窗口打开时自动调用initialize()方法。
下面是我们赢博体育程序initialize()方法的代码:
private ObservableList<Site> sites;@FXML listviewsitelist;@覆盖公共void initialize(URL URL, ResourceBundle rb) {sites = FXCollections.observableArrayList();扫描器输入= null;try {input = new Scanner(new File("password .txt"));} catch(Exception ex) {ex. printstacktrace ();} while(input.hasNext()) {Site newSite = newSite ();newSite.readFrom(输入);sites.add (newSite);} siteList.setItems(网站);}
为了创建一个可观察列表,我们调用JavaFX的FXCollections类中的静态observableArrayList()方法。一旦我们用从文本文件中读取的Site对象填充了列表,我们就可以通过ListView的setItems()方法将该列表传递给ListView。
用户可以单击ListView中的单个项目来选择它们。在这个赢博体育程序中,用户可以选择站点并要求查看他们的数据。他们还可以在列表中选择一个项目,并要求将其从列表中删除。
下面是一些操作方法的代码。
@FXML private void remove() {Site toRemove = (Site) siteList.getSelectionModel().getSelectedItem();if(toRemove != null) sites.remove(toRemove);} @FXML private void view() {Site toView = (Site) siteList.getSelectionModel().getSelectedItem();if(toView != null) {userLabel.setText(toView. getuser ());passwordLabel.setText (toView.getPassword ());}}
要找出用户在列表中选择了什么项,我们首先调用ListView的getSelectionModel()方法,该方法返回一个SelectionModel对象。然后在该对象上调用getSelectedItem()方法来了解用户选择了什么对象。getSelectedItem()返回一个泛型对象引用,因此我们必须进行类型强制转换以将对象引用转换为正确类型的对象。