我想创建一个类,该类创建一个自定义JMenu,设置一些参数,并在用户将鼠标悬停在菜单上时突出显示菜单。这是手动完成时的样子:

menuBar = new JMenuBar();
menuBar.setOpaque(false);

private Font bold_large = new Font("Helvetica", Font.BOLD, 26);

private Color bgColor = Color.BLACK;
private Color highlighted = Color.GREEN;

    //HERE
    JMenu menu = new JMenu(str);
    menu.setPreferredSize(new Dimension(100, 40));
    menu.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseEntered(java.awt.event.MouseEvent evt) {
            menu.setBackground(highlighted);
        }
        public void mouseExited(java.awt.event.MouseEvent evt) {
            menu.setBackground(bgColor);
        }
    });
    menu.setOpaque(true);
    menu.setFont(bold_large);

menuBar.add(menu);


我尝试在新类中编写一个简单的构造函数,该构造函数将创建一个像这样的按钮,几乎具有完全相同的代码,但是没有任何效果(即按钮根本不显示)。我也尝试覆盖paintComponent,尽管收效甚微,因为我对Java还是比较陌生的。

通常,我将如何创建这样的类?覆盖paintComponent是唯一的解决方案吗?如果是这样,我将不胜感激如何正确地举一个例子。

编辑:这是我创建的类,没有明显的作用:

import javax.swing.*;
import java.awt.*;

public class HighlightMenu extends JMenu {

private Font bold_large = new Font("Helvetica", Font.BOLD, 26);

private Color bgColor = Color.getHSBColor(0f, 0f, 60/360f);
private Color highlighted = Color.getHSBColor(0f, 0f, 110/360f);

HighlightMenu(String str) {
    JMenu menu = new JMenu(str);
    menu.setPreferredSize(new Dimension(100, 40));
    menu.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseEntered(java.awt.event.MouseEvent evt) {
            menu.setBackground(Color.GREEN);
        }
        public void mouseExited(java.awt.event.MouseEvent evt) {
            menu.setBackground(UIManager.getColor("control"));
        }
    });
    menu.setOpaque(true);
    menu.setFont(bold_large);
}
}


而我在主要功能中预期的实现将如下所示:

menu = new HighlightMenu("File");
menu.setMnemonic(KeyEvent.VK_D);
menuBar.add(menu);

最佳答案

您在扩展JMenu的同时在HighlightMenu类中创建JMenu变量。扩展意味着它继承了JMenu可用的所有方法。因此,有两种解决方案,第一种是添加一个将返回此JMenu变量的方法。在这种情况下,您不再需要扩展JMenu。但是,我个人认为下面的解决方案要好一些。

我删除了JMenu变量,并从类本身调用了JMenu方法。这些是可访问的,因为您如上所述使用了extends JMenu

import javax.swing.*;
import java.awt.*;

public class HighlightMenu extends JMenu {

    private Font bold_large = new Font("Helvetica", Font.BOLD, 26);

    private Color bgColor = Color.getHSBColor(0f, 0f, 60/360f);
    private Color highlighted = Color.getHSBColor(0f, 0f, 110/360f);

    HighlightMenu(String str) {
        setText(str);
        setPreferredSize(new Dimension(100, 40));
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                setBackground(Color.GREEN);
            }
            public void mouseExited(java.awt.event.MouseEvent evt) {
                setBackground(UIManager.getColor("control"));
            }
        });
        setOpaque(true);
        setFont(bold_large);
    }
}


编辑出了什么问题的额外解释:

菜单显示为空的原因仅仅是因为您要向其中添加一个空的JMenu项。所有执行的操作仅在HighlightMenu内的菜单变量上完成,这意味着该对象本身仍未更改。

10-06 10:47