Java 单击时在JButton上绘制椭圆形

Java 单击时在JButton上绘制椭圆形,java,swing,jbutton,paintcomponent,gomoku,Java,Swing,Jbutton,Paintcomponent,Gomoku,我已经开始为我的Java类做一个项目——LAN gomoku/five连成一行。游戏板由一个充满按钮(JButton)的二维数组表示。使用事件处理程序(类clickHandler),我想在我单击的按钮(clickHandler对象的参数)上画一个椭圆形。但是,我下面的代码不起作用(我不知道如何去掉变量g的空值)。。。我希望你能给我一点建议。多谢各位 class clickHandler implements ActionListener { JButton button

我已经开始为我的Java类做一个项目——LAN gomoku/five连成一行。游戏板由一个充满按钮(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的类中——游戏板上满是按钮——我为每个按钮分配了一个新的动作监听器——clickHandler的一个实例),方法如下:

    gButton.addActionListener(new clickHandler(gButton));
你必须:

  • 扩展JButton类,并重写
    paintComponent(Graphics g)
    方法
  • 请重写
    getPreferredSize()
    方法,该方法将返回
    维度
    对象,并通过为
    容器/组件
    提供一个适当的大小,帮助
    布局管理器
    将您的
    JButton
    放置在容器/组件上

  • 在那里做你的圈码

  • 添加一个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());
        }       
    }
}
你必须:

  • 扩展JButton类,并重写
    paintComponent(Graphics g)
    方法
  • 请重写
    getPreferredSize()
    方法,该方法将返回
    维度
    对象,并通过为
    容器/组件
    提供一个适当的大小,帮助
    布局管理器
    将您的
    JButton
    放置在容器/组件上

  • 在那里做你的圈码

  • 添加一个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(…)
方法一样。太好了,不用担心:)!这是一个快速的回答,我肯定我有一些类似的代码在某处,但你刚刚为我做了,谢谢!嘿,Hidde,谢谢,我还不熟悉标志,但我会尝试完成前两个步骤。标志只是您在扩展
JBitton
类中创建的变量。您将该值设置为true(或1或任何您想要的值),以便
paintComponent
方法知道它已被单击,需要一个圆圈。@Hidde:对不起,我需要编辑。只是无法阻止我自己为测试目的而努力提供SSCCE:-)如果你认为它不应该存在,请随时返回并取消我的编辑。添加了一点,关于重写
getPreferredSize()
方法,就像我们重写
paintComponent(…)
方法一样。太好了,不用担心:)!这是一个快速的回答,我肯定我有一些类似的代码在某处,但你刚刚为我做了,谢谢!“我很感激你的建议。”停止胡闹,在一个方形按钮上放一个椭圆形的图像。我非常怀疑a)学校项目是否需要椭圆形按钮。b) 您可以在适合提交项目的时间内使其工作。-“我不想成为一个杀手锏,只是建议你最后做(或者根本不做)。”我很感激任何一条建议。“停止胡闹,在一个方形按钮上放一个椭圆形的图像。”。我非常怀疑a)学校项目是否需要椭圆形按钮。b) 您可以在适合提交项目的时间内使其工作。-不想成为一个杀手锏,只是建议你最后做(或者根本不做)。