我知道如何使用JMenu創建Java Swing子菜單。當我們將鼠標懸停在一個JMenu的對象,它會顯示一個JPopupMenu中顯示的子菜單項,如:使用JMenu的動態創建Java Swing子菜單
子菜單我的問題是,在我的應用程序,確定哪些菜單元素將有一個子菜單是昂貴的。我不想事先確定一個特定的菜單元素是JMenu還是JMenuItem。我想讓每個元素都成爲JMenuItem,並且只有當用戶請求時才顯示子菜單,例如,將鼠標懸停在菜單項上。像這樣:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Menu2 extends JFrame
{
public Menu2()
{
super("Menu2");
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu mItems = new JMenu("Items");
menuBar.add(mItems);
mItems.add(new JMI("A"));
mItems.add(new JMI("B"));
mItems.add(new JMI("C"));
JLabel stuff = new JLabel("Other stuff");
stuff.setPreferredSize(new Dimension(200,200));
getContentPane().add(stuff);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
}
private class JMI extends JMenuItem
implements MouseListener
{
public JPopupMenu childrenPopup = null;
public JMI(String label)
{
super(label);
addMouseListener(this);
}
// MouseListener
public void mouseClicked(MouseEvent ev) {}
public void mouseEntered(MouseEvent ev)
{
// Show a submenu for item "B" only.
// In real life we'd want a Timer to delay showing the submenu
// until we are sure the user is hovering the mouse.
// For simplicity I've omitted it.
if (getText().equals("B")) {
if (childrenPopup == null) {
childrenPopup = new JPopupMenu();
// Expensive processing to determine submenu elements...
childrenPopup.add("D");
childrenPopup.add("E");
}
// Display the submenu
childrenPopup.show(this,getWidth(),0);
}
}
public void mouseExited(MouseEvent ev) {}
public void mousePressed(MouseEvent ev) {}
public void mouseReleased(MouseEvent ev) {}
}
public static void main(String[] args)
throws Exception
{
new Menu2().setVisible(true);
}
}
唯一的問題是當我手動創建的JPopupMenu被顯示時,菜單的其餘部分被關閉。顯示結果並不像較早的企業之一,而像這樣:
子菜單手動顯示
請注意,我沒有點擊在「B」菜單項,只有感動將鼠標放入它。由於鼠標點擊,菜單沒有關閉。
我該如何做JMenu所做的 - 在不關閉菜單的其餘部分的情況下顯示JPopupMenu?
也許你可以嘗試用JMenu的替代JMenuItem的,一旦你確定它確實確實有子菜單。 – camickr
我認爲像這樣的一個新成語會讓用戶感到困惑,並且最好讓菜單條目始終是一個JMenuItem,它會顯示一個顯示動態確定選項的模式對話框(可能是一個JOptionPane)。 – VGR
謝謝,camickr和VGR,爲您提供瞭解決方法的建議。即使我必須使用解決方法,我也確實想知道爲什麼顯示彈出菜單會導致菜單關閉。很明顯,它可以在不關閉菜單的情況下完成,因爲JMenu可以做到這一點。 – Vine