gpt4 book ai didi

java - 创建自定义 Swing 菜单类

转载 作者:行者123 更新时间:2023-11-30 06:10:07 25 4
gpt4 key购买 nike

我想创建一个类来创建自定义 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 内的菜单变量上完成,这意味着对象本身仍然没有改变。

关于java - 创建自定义 Swing 菜单类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50435013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com