Java 单击时在JButton上绘制椭圆形
我已经开始为我的Java类做一个项目——LAN gomoku/five连成一行。游戏板由一个充满按钮(JButton)的二维数组表示。使用事件处理程序(类clickHandler),我想在我单击的按钮(clickHandler对象的参数)上画一个椭圆形。但是,我下面的代码不起作用(我不知道如何去掉变量g的空值)。。。我希望你能给我一点建议。多谢各位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
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) 您可以在适合提交项目的时间内使其工作。-不想成为一个杀手锏,只是建议你最后做(或者根本不做)。