我对上下文菜单有问题。在本主题之后,我发现在尝试加载上下文菜单insight JavaFX任务时有一个限制。我测试了实现platform.runlater(),但没有成功。
static ContextMenu contextMenuPanel;
public static BorderPane stageContextMenu(BorderPane bp)
{
Platform.runLater(new Runnable() {
@Override public void run() {
contextMenuPanel = new ContextMenu();
}
});
MenuItem item1 = new MenuItem("About");
item1.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
System.out.println("About");
}
});
MenuItem item2 = new MenuItem("Preferences");
item2.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
System.out.println("Preferences");
}
});
MenuItem item3 = new MenuItem("Close");
item3.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
//flow.getChildren().remove(bp);
}
});
contextMenuPanel.getItems().addAll(item1, item2, item3);
bp.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>()
{
@Override
public void handle(ContextMenuEvent event)
{
//contextMenu.hide();
contextMenuPanel.show(bp, event.getScreenX(), event.getScreenY());
event.consume();
}
});
bp.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
contextMenuPanel.hide();
}
});
return bp;
}
其他可能的解决方案是:
static private StringBuilder stringBuilder = new StringBuilder();
private static ContextMenu contextMenu;
private static CountDownLatch menuCreated = new CountDownLatch(1);
static ContextMenu contextMenuPanel;
public static BorderPane stageContextMenu(BorderPane bp) throws InterruptedException
{
new Button();
Task task = new Task()
{
@Override
protected Void call() throws Exception
{
Platform.runLater(new Runnable()
{
@Override
public void run()
{
try
{
contextMenu = new ContextMenu();
contextMenu.setId("Test ID");
menuCreated.countDown();
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
}
}
});
return null;
}
};
new Thread(task).start();
menuCreated.await();
MenuItem item1 = new MenuItem("About");
item1.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
System.out.println("About");
}
});
MenuItem item2 = new MenuItem("Preferences");
item2.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
System.out.println("Preferences");
}
});
MenuItem item3 = new MenuItem("Close");
item3.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent e)
{
//flow.getChildren().remove(bp);
}
});
contextMenuPanel.getItems().addAll(item1, item2, item3);
bp.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>()
{
@Override
public void handle(ContextMenuEvent event)
{
//contextMenu.hide();
contextMenuPanel.show(bp, event.getScreenX(), event.getScreenY());
event.consume();
}
});
bp.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent event)
{
contextMenuPanel.hide();
}
});
return bp;
}
请考虑以下从Task创建上下文菜单的代码。如果去掉锁存器,则上下文菜单在请求其id时不会被构造。
import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.scene.control.Button;
import javafx.scene.control.ContextMenu;
import javafx.stage.Stage;
import java.util.concurrent.CountDownLatch;
public class InitThreadTest extends Application {
static private StringBuilder stringBuilder = new StringBuilder();
private ContextMenu contextMenu;
private CountDownLatch menuCreated = new CountDownLatch(1);
static synchronized void writeString(String s) {
stringBuilder.append(s).append("\n");
}
public static void main(String[] args) {
Application.launch(args);
}
@Override public void init() throws Exception {
new Button();
Task task = new Task() {
@Override
protected Void call() throws Exception {
writeString("Task started");
writeString(Thread.currentThread().getName() + " is fx thread: " +
Platform.isFxApplicationThread());
Platform.runLater(new Runnable() {
@Override
public void run() {
writeString(Thread.currentThread().getName() + " is fx thread: " +
Platform.isFxApplicationThread());
try {
contextMenu = new ContextMenu();
contextMenu.setId("Test ID");
writeString("Created context menu");
menuCreated.countDown();
} catch (Exception ex) {
writeString(ex.getMessage());
ex.printStackTrace();
} finally {
writeString("Test");
}
}
});
writeString("Task finished");
return null;
}
};
new Thread(task).start();
menuCreated.await();
}
@Override public void start(Stage s) {
System.out.println(stringBuilder.toString());
System.out.println("Context menu is " + ((contextMenu == null) ? null : contextMenu.getId()));
Platform.exit();
}
}
我在Visual Studio C#IDE中定义了一个ContextMenuStri上下文菜单,并对程序进行编码,以便当用户右键单击屏幕上的一个对象时,上下文菜单成功弹出。用户可以从上下文菜单中选择一个项目,代码成功确定用户选择了哪个上下文菜单项。到目前为止还不错。问题是上下文菜单接受右键单击作为选择上下文菜单项的机制。当我不小心双击右键单击屏幕上的一个对象时,我注意到了这一点...菜单在第一次单
问题内容: 我有以下带有关联上下文菜单的按钮 单击该按钮时,关联的内容在其下方显示为上下文菜单。 在IE 7以外的所有浏览器上,此功能都非常有效。在IE7中,上下文菜单(ul)显示在其下方的按钮下方。我想这可能是由于堆栈上下文如何解析这些元素。 我的CSS目前看起来像这样: 关于我在做什么错的任何想法吗? 问题答案: 我已经通过更改元素顺序解决了这一问题。我从同时包含按钮和菜单中删除了相对位置元素
PrimeFaces 4.0、Glassfish 3.1.2、Mojarra 2.1.6 我创建了一个p:dataTable和一个对dataTable的contextMenu引用。dataTable的第一列包含p:commandLink。问题是,如果我用鼠标右键单击commandLink,则该行不会被选中。如何选择实际行?我用Javascript尝试了一下,但没有结果。 我想,我应该使用Prime
我想在tableview中添加一个上下文菜单,更具体地说,我想在右键单击时在表行上显示上下文菜单。 我试着用这个代码 上面的代码在JavaFX2.0中工作正常,右键单击时我得到了一个上下文菜单,当我用JavaFX2.1上下文菜单运行我的代码时,它是如何工作的。 我尝试使用showingProperty()方法获取上下文菜单的显示属性,它在JavaFX2.1中返回false,在JavaFX2.0中返
问题内容: 给定以下用例: 我使用D3js渲染由AngularJS管理的对象。我想向D3图表添加交互性。当单击svg元素时,我希望有一种弹出菜单允许修改对象属性。这些属性是AngularJS必需的,但不是D3呈现的。 D3-Angular集成源自使用闭包的http://bl.ocks.org/biovisualize/5372077。 当前实施: 从今天开始,我正在使用angular-ui引导程序
这里有一个项目,我需要在WPF应用程序中自定义上下文菜单,其中将在所有MenuItems的底部放置一个按钮。 但是,如果我要通过XAML添加按钮,它将作为集合中的另一项出现在上下文菜单中,鼠标移过高亮显示将作用于它。 我希望有一个上下文菜单调优到网格样的样式,这样我就可以自定义样式下的它。 有什么想法可以实现这一点(最好是在XAML中)吗?