有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    在扩展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中的菜单变量上执行,这意味着对象本身仍然没有改变