Java Swing:JToolbar如何改变按钮的外观?

4
当您将JButton添加到JToolbar中时,该按钮会采用特定的外观(与将其添加到Jpanel的外观不同)。我创建了一些类似于JToolbar的组件,希望它们具有相同的行为。问题是:我查看了JToolbar类,想找到负责更改已添加组件外观的特定代码(更改组件特定的绘制方法或UI委托等),但我没有找到任何信息!我不理解JToolbar是如何工作的。请问有人可以解释一下吗?
非常感谢,
Herve Guillaume
2个回答

4

这个功能似乎是由MetalButtonUI类的update()方法处理的。以下是来自JDK5_07的代码:

public void update(Graphics g, JComponent c) {
    AbstractButton button = (AbstractButton)c;
    if ((c.getBackground() instanceof UIResource) &&
              button.isContentAreaFilled() && c.isEnabled()) {
        ButtonModel model = button.getModel();
        if (!MetalUtils.isToolBarButton(c)) {
            if (!model.isArmed() && !model.isPressed() &&
                    MetalUtils.drawGradient(
                    c, g, "Button.gradient", 0, 0, c.getWidth(),
                    c.getHeight(), true)) {
                paint(g, c);
                return;
            }
        }
        else if (model.isRollover() && MetalUtils.drawGradient(
                    c, g, "Button.gradient", 0, 0, c.getWidth(),
                    c.getHeight(), true)) {
            paint(g, c);
            return;
        }
    }
    super.update(g, c);
}
isToolBarButton()方法只是检查父容器是否为JToolBar,因此我想一个解决方案是始终将您的JButton添加到JToolBar中,然后将工具栏添加到您的实际容器中。
否则,我想您需要编写自己的自定义UI并覆盖update()方法。

好的,谢谢!这正是我需要的!我将尝试将myJButton添加到一个不可见的JToolBar中。 - paranoia25

1

我认为这只是一个禁用按钮。如果你让你的按钮禁用,它看起来会类似于工具栏中的一个(除了黑色文本颜色)。要更改禁用按钮的文本颜色,您可以覆盖UIManager的默认属性。为了使按钮更像在工具栏中工作,在其中添加MouseListener并在mouseEnter和Exit方法中更改其启用状态。

例如:

    JFrame frame = new JFrame("tool bar button demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(150, 150);
    frame.setLayout(new FlowLayout());

    JToolBar bar = new JToolBar();
    bar.add(new JButton("A button"));
    frame.add(bar);

    // to make text black in disabled button.
    UIManager.getDefaults().put("Button.disabledText",Color.BLACK);

    JButton button = new JButton("A button");
    button.setEnabled(false);
    // if you are setting true or not changing the roll over property 
    // of toolBar then following listerner help to give similar effect
    button.addMouseListener(new MouseListener() {
        @Override
        public void mouseReleased(MouseEvent me) {
        }
        @Override
        public void mousePressed(MouseEvent me) {
        }
        @Override
        public void mouseExited(MouseEvent me) {
            ((JButton)me.getSource()).setEnabled(false);
        }
        @Override
        public void mouseEntered(MouseEvent me) {
            ((JButton)me.getSource()).setEnabled(true);
        }
        @Override
        public void mouseClicked(MouseEvent me) {
        }
    });
    frame.add(button);

    frame.setVisible(true);

谢谢!但我的问题是关于JToolbar如何自动管理其按钮外观的方式。我想为我的自定义小部件实现相同的功能。 - paranoia25

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接