请注意,我正在回答一个 3.5 年前提出的问题。
我相信以下代码可以实现您想要做的事情。代码后的解释。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class MenuTest implements Runnable {
private JFrame frame;
private JTextField textField;
@Override
public void run() {
showGui();
}
private JPanel createMenuPanel() {
JPanel menuPanel = new JPanel();
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Day \u25BC");
JList<Object> list = new JList<Object>(new Object[]{" 01",
" 02",
" 03",
" 04",
" 05",
" 06",
" 07",
" 08",
" 09",
" 10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30"});
list.setPrototypeCellValue("9999");
list.addMouseMotionListener(new MouseAdapter() {
public void mouseMoved(MouseEvent me) {
Point p = me.getPoint();
list.setSelectedIndex(list.locationToIndex(p));
}
});
list.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
textField.setText(list.getSelectedValue().toString());
menu.getPopupMenu().setVisible(false);
}
});
JScrollPane scrollPane = new JScrollPane(list);
menu.add(scrollPane);
menuBar.add(menu);
menuPanel.add(menuBar);
return menuPanel;
}
private JPanel createTextFieldPanel() {
JPanel textFieldPanel = new JPanel();
textFieldPanel.setBorder(BorderFactory.createEmptyBorder(10, 30, 10, 30));
textField = new JTextField(8);
textFieldPanel.add(new JLabel("Selected"));
textFieldPanel.add(textField);
return textFieldPanel;
}
private void showGui() {
frame = new JFrame("Menu");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.add(createMenuPanel(), BorderLayout.CENTER);
frame.add(createTextFieldPanel(), BorderLayout.PAGE_END);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new MenuTest());
}
}
我使用JMenu,因为当您单击JMenu 时,它[通常] 会显示菜单项列表并允许您选择一个。但是您可以向其中添加任何Component,因此我添加了一个包含JList 的JScrollPane。
为了模拟JComboBox 的行为,将鼠标移到列表项上会突出显示鼠标指针下的项,我在JList 中添加了MouseMotionListener。
为了模拟JComboBox 的行为,即通过用鼠标单击来选择列表中的一个项目,关闭弹出列表,我在JList 中添加了一个MouseListener。请注意,MouseListener 还会在JTextField 中显示JList 选定项。