Gil*_*ili 6 java swing jmenupopup
在过去,当一个人JPopupMenu看到它时,它的第一个项目将被默认选中:http://weblogs.java.net/blog/alexfromsun/archive/2008/02/jtrayicon_updat.html
现在,默认行为是弹出菜单而不选择任何项目.我想创建一个JPopupMenu单独的项目,将弹出选中并在鼠标指针下居中.我已设法让项目以鼠标为中心弹出,但我JMenuItem拒绝渲染,就像它被选中一样.如果我将鼠标移出项目并返回其中,则选择正确.
有任何想法吗?
这是我的测试用例:
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
public class Test extends JFrame
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(800, 600);
frame.getContentPane().addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent e)
{
if (e.isPopupTrigger())
popupTriggered(e);
}
@Override
public void mouseReleased(MouseEvent e)
{
if (e.isPopupTrigger())
popupTriggered(e);
}
private void popupTriggered(MouseEvent e)
{
JPopupMenu menu = new JPopupMenu();
final JMenuItem item = new JMenuItem("This is a JMenuItem");
menu.add(item);
Point point = e.getPoint();
int x = point.x - (item.getPreferredSize().width / 2);
int y = point.y - (item.getPreferredSize().height / 2);
menu.show((Component) e.getSource(), x, y);
}
});
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
事实证明是秘密 MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, ...});
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.MenuElement;
import javax.swing.MenuSelectionManager;
import javax.swing.SwingUtilities;
/**
* Demonstrates programmatic {@link JMenuItem} selection;
* specifically how to make the first item selected by default
*/
public class TestPopup extends JFrame {
public static void main(String[] args) {
final JFrame frame = new JFrame("TestPopup");
frame.setSize(640, 480);
frame.getContentPane().addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
popupTriggered(e);
}
}
private void popupTriggered(MouseEvent e) {
final JPopupMenu menu = new JPopupMenu();
final JMenuItem item0 = new JMenuItem("JMenuItem 0");
final JMenuItem item1 = new JMenuItem("JMenuItem 1");
menu.add(item0);
menu.add(item1);
menu.pack();
// use invokeLater or just do this after the menu has been shown
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, item0});
}
});
int x = (int) ((int) (frame.getSize().width - (menu.getPreferredSize().width / 2.)) / 2.);
int y = (int) ((int) (frame.getSize().height - (menu.getPreferredSize().height / 2.)) / 2.);
menu.show(frame, x, y);
// doesn't work:
//item0.setSelected(true);
// doesn't work:
//menu.getSelectionModel().setSelectedIndex(0);
// bingo; see also MenuKeyListener / MenuKeyEvent
// MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, item0});
}
});
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
如今,默认行为是弹出菜单而不选择任何项目。
实际上,我认为这是正确的行为,至少在 Windows 中是这样。其他非 Java 应用程序也这样做。我认为即使菜单中只有一项,也不值得打破这一惯例。如果您不这么认为,您可以按照Sean.bright 的回答设置选择索引。
所以,我终于有机会在 Java 上尝试一下1.6.0_11,并发现了一些不一致的行为:如果弹出菜单伸出父框架,则自动选择该项目;如果弹出菜单完全出现在父框架内,则不会选择任何内容。听起来像是一个 Swing bug,它至少保证了 RFE 的行为一致。
| 归档时间: |
|
| 查看次数: |
6400 次 |
| 最近记录: |