JMenuBar上的组件

时间:2015-11-21 10:04:36

标签: java graphics jmenuitem jmenubar

我正在寻找一种方法来改变JMenuBar

上组件的图形

我有以下JMenuBar

package GUIMain;

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

public class MyMenuBar extends JMenuBar
{
    int fontMetrics;
    FontMetrics fM;

    JLabel lblSmartSize = new JLabel("", SwingConstants.CENTER);
    JCheckBox chkbtnSmartSize = new JCheckBox();

    SortsGui sG;

    public MyMenuBar(SortsGui sG)
    {
        this.sG = sG;
        setBorderPainted(true);
        makePopUpMenu();
    }

    void makePopUpMenu()
    {
        add(Box.createHorizontalGlue());

        fM = lblSmartSize.getFontMetrics(lblSmartSize.getFont());
        fontMetrics = fM.stringWidth("Enable Smart Resizing?");
        lblSmartSize.setMinimumSize(new Dimension(fontMetrics+10,25));
        lblSmartSize.setPreferredSize(new Dimension(fontMetrics+10,25));
        lblSmartSize.setMaximumSize(new Dimension(fontMetrics+10,25));
        add(lblSmartSize);

        chkbtnSmartSize.setBackground(lblSmartSize.getBackground());
        add(chkbtnSmartSize);
    }
}

这会创建一个JMenuBar,看起来像这样(对于爆炸截屏道歉) Shows picture of the menu bar

正如您所看到的,JMenuBar上有JLabelJCheckBox。如何更改JCheckBox的背景,使其周围没有正方形,这与JMenuBar的标准外观不同。

我已经尝试了以下代码并且到目前为止还没有成功

chkbtnSmartSize.setBackground(this.getBackground());

(在不同的尝试中)

chkbtnSmartSize.setBackground(lblSmartSize.getBackground());

任何帮助实现这一点都将是非常感激的

谢谢,

1 个答案:

答案 0 :(得分:0)

事实证明,有几种方法可以做到这一点。

最简单的方法是删除组件的边框和背景。例如,我应该使用此复选框

chkbtnSmartSize.setOpaque(false);
chkbtnSmartSize.setContentAreaFilled(false);
chkbtnSmartSize.setBorder(null);
chkbtnSmartSize.setFocusable(false);

另一种方法是更改​​JMenuBar的背景,然后对复选框执行相同操作。

Color color = Color.red; 
@Override //This Method changes the background colour of the JMenuBar
protected void paintComponent(Graphics g) {

    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(color);
    g2d.fillRect(0, 0, getWidth() - 1, getHeight() - 1);

}
...
chkbtnSmartSize.setBackground(color);

如果删除复选框的背景并更改JMenuBar的颜色,则不需要代码行chkbtnSmartSize.setBackground(color);

最后,如果您将JComponent的背景设置为JMenuBar背景的相同颜色,则其效果与第一种方法相同。