【问题标题】:JavaFX8 CustomRowFactory ContextMenu background image not entirely visibleJavaFX 8 自定义 RowFactory ContextMenu 背景图像不完全可见
【发布时间】:2014-04-17 13:13:43
【问题描述】:

我设置了以下自定义行工厂:

treeTblViewFiles.setRowFactory(new Callback<TreeTableView<FileModel>, TreeTableRow<FileModel>>() {

            @Override
            public TreeTableRow<FileModel> call(TreeTableView<FileModel> treeTableView) {
                final TreeTableRow<FileModel> row = new TreeTableRow<>();
                final ContextMenu rowMenu = new ContextMenu();
                MenuItem removeItem = new MenuItem("Remove");
                removeItem.setOnAction(new EventHandler<ActionEvent>() {

                    @Override
                    public void handle(ActionEvent t) {
                        int currentPlaylistIndex = m_playlists.indexOf(row.getTreeItem().getParent().getValue());
                        boolean itemRemoved = false;
                        if (row.getItem().getClass().equals(Song.class)) {
                            itemRemoved = m_playlists.get(currentPlaylistIndex).getSongs().remove(row.getItem());
                            m_playlists.get(currentPlaylistIndex).updatePlaylist((Song) row.getItem());
                        } else if (row.getItem().getClass().equals(Playlist.class)) {
                            itemRemoved = m_playlists.remove(row.getTreeItem().getValue());
                        }
                        TreeItem<FileModel> treeItem = row.getTreeItem();
                        // may need to check treeItem.getParent() is not null:
                        treeItem.getParent().getChildren().remove(treeItem);
                        treeTblViewFiles.getSelectionModel().clearSelection();
                        if (MyApp.DEBUG) {
                            System.out.println(m_playlists.size());
                            if (currentPlaylistIndex > -1) {
                                System.out.println(m_playlists.get(currentPlaylistIndex).getSongs().size());
                            }
                        }
                    }
                });
                rowMenu.getItems().add(removeItem);
                row.contextMenuProperty().bind(Bindings.when(Bindings.isNotNull(row.itemProperty()))
                        .then(rowMenu)
                        .otherwise((ContextMenu) null));
                return row;
            }

        });

在我的 css 中有:

/******************
 * ContextMenu
 ******************/
.context-menu{
        -fx-background-color: transparent;
}
.context-menu .menu-item{
    -fx-background-image: url("styles/cm_bg.png");
    -fx-background-repeat: no-repeat;
    -fx-background-position: center;
        -fx-background-color: transparent;
}
.context-menu .menu-item .label{
        -fx-text-fill: #ababab;
    -fx-font-weight: normal;
    -fx-font-size: 12pt;
}

问题在于它不显示整个图像(即 220x40),而只显示适合“删除”字符串的宽度。最右边的部分被剪掉了。

编辑: 简化版(标签上的 contextMenu 的结果相同):

ContextMenu cm = new ContextMenu();
MenuItem mi = new MenuItem("Test");
cm.getItems().addAll(mi);
lblUploader.setContextMenu(cm);

为什么会发生这种情况以及如何解决?

提前致谢。

【问题讨论】:

  • 这是特定于树表视图行单元格上的上下文菜单,还是同样的事情发生在放置在非虚拟化控件上的上下文菜单上? (即,您可以通过在标签上放置上下文菜单来重现这一点吗?)
  • 我在标签上测试过,有相同的图片
  • 也许用一个带有标签的简单示例来更新您的问题,因为它更容易让人们重现?一般来说,诊断这类问题的最佳方法是使用ScenicView,尽管我从未尝试使用ContextMenu
  • 谢谢,我试试看。

标签: css javafx contextmenu menuitem


【解决方案1】:

使用以下 .css 解决了问题:

.context-menu {
    -fx-background-color: transparent;  
    -fx-min-width: <image_width>;
    -fx-min-height: <image_height>; 
}

请记住设置首选(或最小)尺寸。

【讨论】:

  • 这可能只是一种解决方法,但对我来说已经足够了。
猜你喜欢
  • 2012-03-31
  • 2016-07-28
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多