在我的JavaFX项目中,我有一个ModifiedTreeCell
类extends TreeCell
。在那个类中,我有两个函数可以监听鼠标是进入还是退出TreeCell。然而,这些方法似乎非常不可靠。
或者:
A)他们根本没有检测到鼠标进入,也没有弹出窗口。
B)他们一直在呼叫ENTERED
和EXITED
,所以弹出窗口一遍又一遍地闪烁。
C)他们将检测到Enter
,然后立即检测到Exit
,即使鼠标仍然在Label
的边界内。
我该如何解决这个问题?
如果你想亲眼看看我的意思,我编译了一个我项目的可运行Jar文件:
Here is the repo。下载后,运行D2BT.jar
并创建一个新帐户,一个新角色,然后添加Ring
之类的项目,点击Magic
中的ChoiceBox
,然后点击添加项Button
。转到查看帐户树Tab
,然后将鼠标悬停在其中一个Label
(蓝色)中。
好的,在下面的图片中,我知道我的鼠标光标看起来像是在Label
的边缘,但是我告诉你,如果你自己尝试过它并不是吗?真的很重要鼠标在哪里。 setOnMouseEntered/Exited
命令根本无法正常工作。我知道它似乎是ItemFrame
Popup
导致问题,但我向您保证即使您发表评论frame.show();
和frame.hide();
也会发生这种情况方法中显示的方法。
以下是ModifiedTreeCell
类:
package application;
import javafx.scene.control.Label;
import javafx.scene.control.TreeCell;
import logic.Item;
/**
* This TreeCell object is for the TreeCellFactory
* function in the GUI class. The TreeCellFactory
* function will convert TreeItem objects into
* ModifiedTreeCell objects which display the
* necesary information to the user, such as
* a Label displaying either the Account name,
* Character name, or Item in a readable fashion.
* @author Kevin
*
*/
public class ModifiedTreeCell extends TreeCell<TreeViewable>
{
/**
* This Label will display the neccesary text related to the item.
* The Label may have a `on Mouse Hover` listener which will display
* a ItemFrame_Animated IF the TreeViewable object claims it to be an item.
*/
private Label displayProperty;
@Override public void updateItem(TreeViewable value, boolean empty)
{
if (!empty)
{
setEditable(true);
// Create the label for this cell.
displayProperty = new Label(value.getTextProperty());
displayProperty.getStyleClass().clear();
// If Value is an Item object...
if (value instanceof Item)
{
// Item Reference.
Item ref = (Item) value;
// Create a Popup window of the item hovered over.
ItemFrame_Animated frame = new ItemFrame_Animated(ref);
displayProperty.setFont(GUI.diabloFont);
displayProperty.setTextFill(ref.getQuality().getColor());
displayProperty.setOnMouseEntered(e ->
{
System.out.println("MOUSE ENTERED THIS LABEL");
frame.show(GUI.window);
});
displayProperty.setOnMouseExited(e ->
{
System.out.println("MOUSE EXITED THIS LABEL");
frame.hide();
});
}
displayProperty.setStyle(GUI.DEBUG_PANE_BORDER);
// Display a Node for this cell.
setGraphic(displayProperty);
}
else
{
// No cell to be displayed, set to null.
setText("");
setGraphic(null);
}
}
}
答案 0 :(得分:1)
我终于成功编译了你的项目。
结果并不令人意外 - &gt;通过评论frame.hide()
行,弹出窗口保持打开状态。以下是3.
现在你可以申请一些积分来获得一个不会很快变得混乱的超级应用程序。
File
类和{{1方法。我希望你能成功为所有Diablo2游戏玩家提供一个非常有用的应用程序! :)