【问题标题】:Drawing an oval on JButton when clicked单击时在 JButton 上绘制一个椭圆
【发布时间】:2012-05-25 22:34:21
【问题描述】:

我已经开始为我的 Java 课程开发一个项目 - LAN gomoku/连续五个。游戏板由一个填充有按钮 (JButton) 的二维数组表示。使用事件处理程序(clickHandler 类),我想在单击的按钮上绘制一个椭圆(clickHandler 对象的参数)。我的以下代码没有工作(我不知道如何摆脱变量 g 的空值)......我将不胜感激任何建议。非常感谢。

    class clickHandler implements ActionListener {

        JButton button;
        Dimension size;
        Graphics g;

        public clickHandler(JButton button) {
            this.button = button;
            this.size = this.button.getPreferredSize();
        }

        @Override
        public void actionPerformed(ActionEvent ae) {
                this.g.setColor(Color.BLUE);
                this.g.fillOval(this.button.getHorizontalAlignment(), this.button.getVerticalAlignment(), this.size.width, this.size.height);

                this.button.paint(this.g);
                this.button.setEnabled(false);
        }
    }

(在一个创建 GUI 的类中 - 充满按钮的游戏板 - 我为每个按钮分配一个新的 Action Listener - clickHandler 的一个实例)这样:

    gButton.addActionListener(new clickHandler(gButton));

【问题讨论】:

  • “我将不胜感激任何建议。” 停止胡闹,将椭圆形图像放在方形按钮上。我非常怀疑 a) 学校项目需要椭圆形按钮。 b) 你可以让它在适合提交项目的时间内工作。 -- 不打算成为一个杀人狂,只是建议你最后(或根本不)这样做。

标签: java swing jbutton paintcomponent gomoku


【解决方案1】:

你必须:

  • 扩展 JButton 类,并覆盖 paintComponent(Graphics g) 方法。
  • 覆盖getPreferredSize() 方法,该方法将返回Dimension 对象,并通过提供适当的大小来帮助Layout Manager 将您的JButton 放置在Container/Component 上。

  • 在那里制作您的圈子代码。

  • 添加一个onClickListener,如果被点击的按钮被点击,则为其设置一个标志,并调用它进行重绘。


关于Graphics 对象:最好将其保留在paintComponent 方法中,并仅在其中使用它。它总是会在重新绘制时传递,如果你将它保存到其他时刻,可能会发生奇怪的事情(快乐的实验:))。

一个小例子:

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

public class ButtonExample
{
    private MyButton customButton;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Custom Button Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        customButton = new MyButton();
        customButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                MyButton.isClicked = true;
                customButton.repaint();
            }
        });

        frame.getContentPane().add(customButton, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new ButtonExample().displayGUI();
            }
        });
    }
}

class MyButton extends JButton
{
    public static boolean isClicked = false;

    public Dimension getPreferredSize()
    {
        return (new Dimension(100, 40));
    }

    public void paintComponent(Graphics g)
    {
        if (!isClicked)
            super.paintComponent(g);
        else
        {
             g.setColor(Color.BLUE);
             g.fillOval(getHorizontalAlignment(), getVerticalAlignment(), getWidth(), getHeight());
        }       
    }
}

【讨论】:

  • 嘿,Hidde,谢谢,我还不熟悉标志,但我会尝试完成前两个步骤。
  • 标志只是您在扩展JBitton 类中创建的变量。您将该值设置为 true(或 1 或您想要的任何值),以便 paintComponent 方法知道它已被单击并需要一个圆圈。
  • @Hidde :对不起,我的编辑。只是无法阻止自己为测试目的而努力提供 SSCCE :-) 如果您认为它不应该存在,请随时恢复并取消我的编辑。
  • 添加了一点,关于覆盖getPreferredSize() 方法,就像我们覆盖我们的paintComponent(...) 方法一样。
  • 太好了,不用担心 :)!这是一个快速的答案,我确定我在某个地方有一些这样的代码,但你刚刚为我完成了,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2015-05-08
相关资源
最近更新 更多