ListView,通过双击选择项目
我有一个主窗口,用户可以通过单击ListView项来选择程序功能。然而,即使他完全在项目(白色箭头)之外单击,程序仍会启动“数字生成器”功能。我不喜欢那样ListView,通过双击选择项目,listview,javafx-8,Listview,Javafx 8,我有一个主窗口,用户可以通过单击ListView项来选择程序功能。然而,即使他完全在项目(白色箭头)之外单击,程序仍会启动“数字生成器”功能。我不喜欢那样 public class MainRootController2 extends Controller implements Initializable { @FXML StackPane stackPane; @FXML ListView<String> listView; privat
public class MainRootController2 extends Controller implements Initializable {
@FXML
StackPane stackPane;
@FXML
ListView<String> listView;
private ObservableList<String> list;
@Override
public void initialize(URL location, ResourceBundle resources) {
//making a list and setting a background
list = FXCollections.observableArrayList("Number Generator", "Cards");
listView.setBackground(new Background(new BackgroundImage(new Image("MainRootBackground.jpg"),
BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
BackgroundPosition.CENTER, BackgroundSize.DEFAULT)));
listView.setItems(list);
listView.getSelectionModel().clearSelection();
}
@Override
public Pane getMainPane() {
return stackPane;
}
/************************ EVENTS *************************/
@FXML
private void listViewMouseDoubleClicked(MouseEvent e){
if(e.getClickCount() > 1){
String s = listView.getSelectionModel().getSelectedItem();
switch(s){
case "Number Generator":
ChangeTheRoot change = new ChangeTheRoot();
if( change.initialize(Main.primaryStage, true, Main.NUMBER_GENERATOR_ROOT, "Number Generator", true, new NumberGeneratorController()) == false)
Dialogs.create().title("Error").masthead(null).message("Couldn't load the components!").showInformation();
change.doFadingTransition(stackPane, Main.fadeOutMillis, Main.fadeInMillis, true);
break;
default:
break;
}
}
}
}
public类MainRootController2扩展控制器实现可初始化{
@FXML
堆叠窗格堆叠窗格;
@FXML
列表视图列表视图;
私人观察者名单;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
//制作列表并设置背景
列表=FXCollections.observableArrayList(“数字生成器”、“卡片”);
setBackground(新背景)(新背景图像)(新图像(“MainRootBackground.jpg”),
背景重复,不重复,背景重复,不重复,
BackgroundPosition.CENTER、BackgroundSize.DEFAULT));
setItems(列表);
listView.getSelectionModel().clearSelection();
}
@凌驾
公共窗格getMainPane(){
返回堆栈窗格;
}
/************************事件*************************/
@FXML
私有无效列表视图鼠标双击(鼠标事件e){
如果(如getClickCount()>1){
字符串s=listView.getSelectionModel().getSelectedItem();
开关{
案例“数字生成器”:
changetroot change=新的changetroot();
if(change.initialize(Main.primaryStage,true,Main.NUMBER\u GENERATOR\u ROOT,“NUMBER GENERATOR”,true,new NumberGeneratorController())==false)
Dialogs.create().title(“Error”).maisthead(null).消息(“无法加载组件!”).showInformation();
change.doFadingTransition(stackPane,Main.fadeOutMillis,Main.fadeInMillis,true);
打破
违约:
打破
}
}
}
}
编辑。。。。固定版本:
public class MainRootController2 extends Controller implements Initializable {
@FXML
StackPane stackPane;
@FXML
ListView<String> listView;
private ObservableList<String> list;
@Override
public void initialize(URL location, ResourceBundle resources) {
//making a list and setting a background
list = FXCollections.observableArrayList("Number Generator", "Cards");
listView.setBackground(new Background(new BackgroundImage(new Image("MainRootBackground.jpg"),
BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT,
BackgroundPosition.CENTER, BackgroundSize.DEFAULT)));
listView.setItems(list);
listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> list) {
return new MouseClickListCell();
}
});
listView.getSelectionModel().clearSelection();
}
@Override
public Pane getMainPane() {
return stackPane;
}
/************************ EVENTS *************************/
private void fireUpTheFeature(String name){
String s = listView.getSelectionModel().getSelectedItem();
switch(s){
case "Number Generator":
ChangeTheRoot change = new ChangeTheRoot();
if( change.initialize(Main.primaryStage, true, Main.NUMBER_GENERATOR_ROOT, "Number Generator", true, new NumberGeneratorController()) == false)
Dialogs.create().title("Error").masthead(null).message("Couldn't load the components!").showInformation();
change.doFadingTransition(stackPane, Main.fadeOutMillis, Main.fadeInMillis, true);
break;
case "Cards":
break;
default:
break;
}
}
public class MouseClickListCell extends ListCell<String>
{
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if(empty) {
setText(null);
setOnMouseClicked(null);
}
else {
setText(item.toString());
setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if(event.getClickCount() > 1){
fireUpTheFeature(getItem());
}
}
});
}
}
}
}
public类MainRootController2扩展控制器实现可初始化{
@FXML
堆叠窗格堆叠窗格;
@FXML
列表视图列表视图;
私人观察者名单;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
//制作列表并设置背景
列表=FXCollections.observableArrayList(“数字生成器”、“卡片”);
setBackground(新背景)(新背景图像)(新图像(“MainRootBackground.jpg”),
背景重复,不重复,背景重复,不重复,
BackgroundPosition.CENTER、BackgroundSize.DEFAULT));
setItems(列表);
setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView列表){
返回新的MouseClickListCell();
}
});
listView.getSelectionModel().clearSelection();
}
@凌驾
公共窗格getMainPane(){
返回堆栈窗格;
}
/************************事件*************************/
私有void fireUpTheFeature(字符串名称){
字符串s=listView.getSelectionModel().getSelectedItem();
开关{
案例“数字生成器”:
changetroot change=新的changetroot();
if(change.initialize(Main.primaryStage,true,Main.NUMBER\u GENERATOR\u ROOT,“NUMBER GENERATOR”,true,new NumberGeneratorController())==false)
Dialogs.create().title(“Error”).maisthead(null).消息(“无法加载组件!”).showInformation();
change.doFadingTransition(stackPane,Main.fadeOutMillis,Main.fadeInMillis,true);
打破
案例“卡片”:
打破
违约:
打破
}
}
公共类MouseClickListCell扩展ListCell
{
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
setOnMouseClicked(空);
}
否则{
setText(item.toString());
setOnMouseClicked(新事件处理程序(){
@凌驾
公共无效句柄(MouseeEvent事件){
如果(event.getClickCount()>1){
fireUpTheFeature(getItem());
}
}
});
}
}
}
}
我没有看到您的FXML文件,但从您的命名我可以猜到,每当您的列表视图被单击时,您的控制器方法就会被激发
每当用户单击列表视图
区域中的任何位置时,就会触发此事件。您需要的是删除鼠标单击的处理程序,并将该代码移动到列表单元格
呈现程序中
如果仅将鼠标侦听器附加到非空单元格,则仅当单击ListCell
时才会触发代码
例如:
public static class MouseClickListCell<T> extends ListCell<T>
{
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if(empty) {
setText(null);
setOnMouseClicked(null);
}
else {
setText(item.toString());
setOnMouseClicked(ev -> doMagic());
}
}
}
公共静态类MouseClickListCell扩展ListCell
{
@凌驾
受保护的void updateItem(T项,布尔值为空){
super.updateItem(项,空);
if(空){
setText(空);
setOnMouseClicked(空);
}
否则{
setText(item.toString());
setOnMouseClicked(ev->doMagic());
}
}
}
设置鼠标点击(ev->doMagic())代码>但是我怎么知道哪个单元格被点击了???你读过JavaDocs吗?在您的ListCell
中,您可以执行getItem()
来获取单元格的当前项……对于这样一个小功能,有很多更改。我做了一些改变,效果很好!谢谢(我还把整个固定鳕鱼