java创建自定义Swing菜单类
我想创建一个类,该类创建一个自定义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);
# 1 楼答案
在扩展JMenu时,您正在HighlightMenu类中创建一个JMenu变量。扩展意味着它继承JMenu可用的所有方法。所以有两种解决方案,第一种是添加一个方法来返回这个JMenu变量。在这种情况下,您就不必再扩展JMenu了。然而,我个人认为下面的解决方案更好一些
我删除了JMenu变量,并从类本身调用了JMenu方法。这些是可访问的,因为您使用了
extends JMenu
,如上所述编辑错误原因的额外解释:
菜单显示为空的原因很简单,因为您向其中添加了一个空的JMenu项。所有执行的操作都只在HighlightMenu中的菜单变量上执行,这意味着对象本身仍然没有改变