【问题标题】:How to draw a colored rectangle on a JButton?如何在 JButton 上绘制彩色矩形?
【发布时间】:2012-04-26 12:59:32
【问题描述】:

我将使用 Swing UI 增强应用程序,以允许用户选择颜色,这样他们就不会被默认颜色选择所困扰。

It is common for other applications to have shaded rectangles drawn on each button that activates a color selector, with the rectangle's color changing accordingly when a new color is selected.我试图通过在按钮上放置一个带有所选颜色的小 JPanel 来达到相同的效果,但这会导致按钮中间出现一个小方块,而不是填充按钮的大部分表面。

我认为另一种方法是动态生成带有颜色的矩形图标,然后为每个按钮添加适当的图标,但肯定有更简单的方法吗?

【问题讨论】:

  • 由于无法为按钮制作自定义渲染器,我认为这不会很容易。但我想你总是可以制作一个自定义按钮(比如 ColourButton)。否则你的图标解决方案看起来很不错。
  • 您是否在按钮上尝试过 setBackground(Color)(确保按钮不透明,使用 setOpaque(boolean))?
  • 是的,我试过setBackground(),但它只会改变按钮周围矩形的颜色,不会改变按钮的表面颜色。

标签: java swing jbutton


【解决方案1】:

JButton.setIcon 与预期的Rectangle 放在一起,用于example

编辑

我试图通过在按钮上放置一个带有所选颜色的小 JPanel 来达到相同的效果,但这会导致按钮中间出现一个小方块,而不是填充按钮的大部分表面。

只有 JFrame (BorderLayout)JPanel (FlowLayout) 已预先实现 LayoutManager,对于其余的 JComponents(将一个 JComponent 添加到另一个 JComponent)您必须定义 LayoutManagerplease read this thread

【讨论】:

  • 我认为这种方法不仅比其他答案中建议的设置 BG 更健壮,而且更像是 OP 所追求的用户体验“最不意外的路径”。 @trashgod 的可爱小补充,尽管我仍然在使用 Icon 和更改 BufferedImageGraphics 之间犹豫不决。
  • @AndrewThompson:好点。当我想利用组件的文本对齐时,我将实现IconBufferedImage 便于合成。
  • 我最终使用了 ColorIcon 示例中的技术在每个按钮上绘制了一个填充的矩形图标。我没想到会这么简单。 Trashgod,如果您将您的 ColorIcon 评论重写为答案,我会接受它。
【解决方案2】:

这是一个使用 setBackground 的示例,适用于我:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

    public static void main(String... args) {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        final JButton button = new JButton("Hello");
        button.setOpaque(true);
        panel.add(button);
        button.setBackground(Color.RED);
        button.setOpaque(true);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Color c = JColorChooser.showDialog(button, "Choose a color", button.getBackground());
                if (c != null) {
                    button.setBackground(c);
                }
            }
        });
        frame.setContentPane(panel);
        frame.setPreferredSize(new Dimension(800, 600));
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
}

【讨论】:

  • 虽然上面的代码适用于默认外观,但对于 Windows 外观,它不能按预期工作;它只显示按钮周围的红色矩形,并且按钮的表面颜色不会改变。
【解决方案3】:

每个摇摆组件都是使用 JComponent.drawComponent(...) 方法绘制的,您可以根据需要覆盖默认行为。例如,制作您建议的面板。不过值得注意的是,您可以更改 jpanels 背景颜色来实现完全相同的效果。

    JColorChooser chooser = new JColorChooser(Color.BLACK);
    chooser.setVisible(true);

    Color color = chooser.getColor();
    if (color!=null) {
        colorPanel.setBackground(color);
    }

其中 colorPanel 将是您的 JPanel,指示您的颜色。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多