目前使用SWING实现JMenuBar,其中有2个不同的JMenus。一个叫做gameMenu,一个叫做addMenuGame。
我在gameMenu中有几个JMenuItems,它们都是用这个方法在我的界面控制器中实现的。
public void addGameMenu(JMenu control) {
String fileName = "gamemodes.txt";
try {
FileReader inputFile = new FileReader(fileName);
BufferedReader bufferReader = new BufferedReader(inputFile);
String line;
while ((line = bufferReader.readLine()) != null) {
String split[] = line.split("#");
for (int i = 0; i < split.length; i++) {
control.add(split[i]);
}
}
bufferReader.close();
} catch (Exception e) {
System.out.println("Fejl ved linje:" + e.getMessage());
}
}
它的作用是从文本文件的每一行读取,并将其添加到JMenu,称为gameMenu。但是,我只能向JMenu添加actionlisteners,而不能添加JMenu的JMenuItem。在JFrame主空白中,我就是这样实现的:
public class index extends javax.swing.JFrame {
QuizzControlHandler dd = new QuizzControlHandler();
private JMenuItem dc;
/**
* Creates new form index
*/
public index(){
initComponents();
dd.addGameMenu(menuGame);
}
}
这将正确填充我的菜单,但是,我需要检索用户点击的内容。
答案 0 :(得分:3)
但是,我只能向JMenu添加actionlisteners,而不是JMenuItem,
用户点击JMenuItem
,因此您需要将ActionListener
添加到JMenuItem
而不是JMenu。
在调用addGameMenu(...)
之前,您可以使用以下代码创建一个ActionListener
以供所有JMenuItem共享:
ActionListener al = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
JMenuItem menuItem = (JMenuItem)e.getSource();
System.out.println(menuItem.getText());
}
}
然后,您可以将addGameMenu(JMenu control, ActionListener al)
更改为第二个参数。
然后在你改变的方法中:
//control.add(split[i]);
JMenuItem menuItem = new JMenuItem( split[I] );
menuItem.addActionListener( al );
control.add( menuItem );
答案 1 :(得分:2)
Camickr打败了我。
当您应该添加构造的JMenuItem时,您正在向JMenu添加简单的字符串。换句话说,当你可以添加智能对象时,不要将哑对象添加到菜单中。例如:
import java.awt.event.ActionEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class TestMenus extends JPanel {
public TestMenus() {
}
public void addGameMenu(JMenu control) {
String[] texts = { "One", "Two", "Three", "Four", "Five" };
for (int i = 0; i < texts.length; i++) {
control.add(new JMenuItem(new MenuItemAction(texts[i])));
}
}
private class MenuItemAction extends AbstractAction {
public MenuItemAction(String name) {
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Menu item: " + e.getActionCommand());
}
}
private static void createAndShowGui() {
TestMenus mainPanel = new TestMenus();
JMenu menu = new JMenu("Menu");
mainPanel.addGameMenu(menu);
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu);
JFrame frame = new JFrame("TestMenus");
frame.setJMenuBar(menuBar);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createAndShowGui();
});
}
}