我已经开始为我的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));
答案 0 :(得分:4)
你必须:
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());
}
}
}