我想创建一个创建自定义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);
}
}
我在main函数中的预期实现将如下所示:
menu = new HighlightMenu("File");
menu.setMnemonic(KeyEvent.VK_D);
menuBar.add(menu);
答案 0 :(得分: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内的菜单变量上完成,这意味着对象本身仍未被更改。