当您将 JButton 添加到 JToolbar 时,该按钮具有特定的外观(与将其添加到 Jpanel 时不同)。我创建了一些类似于 JToolbar 的组件,并且我想要相同的行为。问题:我检查了 JToolbar 类,找到了一些负责更改添加组件外观的特定代码(更改组件特定的绘制方法或 UI 委托等)。我什么也没找到!我不明白 JToolbar 是如何工作的。谁能解释一下它是如何工作的?
非常感谢,
赫夫·纪尧姆
当您将 JButton 添加到 JToolbar 时,该按钮具有特定的外观(与将其添加到 Jpanel 时不同)。我创建了一些类似于 JToolbar 的组件,并且我想要相同的行为。问题:我检查了 JToolbar 类,找到了一些负责更改添加组件外观的特定代码(更改组件特定的绘制方法或 UI 委托等)。我什么也没找到!我不明白 JToolbar 是如何工作的。谁能解释一下它是如何工作的?
非常感谢,
赫夫·纪尧姆
这似乎是由类的update()
方法处理的MetalButtonUI
。这是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() 方法。
我认为这只是一个禁用按钮。如果你让你的按钮禁用它看起来类似于工具栏中的一个(黑色文本颜色除外)。要更改禁用按钮的文本颜色,您可以覆盖 UIManager 的默认属性。为了使按钮更有可能像在 toolBar 中一样工作,请将 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);