gpt4 book ai didi

java - 单击时在 JButton 上绘制一个椭圆

转载 作者:行者123 更新时间:2023-11-29 03:46:14 25 4
gpt4 key购买 nike

我已经开始为我的 Java 类(class)开发一个项目 - LAN 五子棋/五连胜。游戏板由一个充满按钮 (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 监听器 - clickHandler 的实例)这样:

    gButton.addActionListener(new clickHandler(gButton));

最佳答案

你必须:

  • 扩展 JButton 类,并覆盖 paintComponent(Graphics g)方法。
  • 覆盖 getPreferredSize()方法,它将在 Dimension 返回对象并将帮助 Layout Manager在放置您的 JButtonContainer/Component 上,通过为其提供一个合适的尺寸。

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

  • 添加一个onClickListener,如果被点击,则在被点击的按钮上设置一个标志,并调用它重新绘制。


关于 Graphics object: 最好放在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());
}
}
}

关于java - 单击时在 JButton 上绘制一个椭圆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10762080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com