Java 按JButton绘制球,球不可见
所以,每当用户按下JButton时,我想画一个球。我的问题是,调用revalidate()和repaint()后,球不可见。我忘了什么吗? 这是我的代码,我有另一个用于队列和堆栈的类,这就是我扩展Queueue的原因。我的按钮是可见的,当我按下它们时,我知道它们会工作,球不会出现在屏幕上。早些时候,我尝试在ActionListener中使用void paintComponent,但它无法工作。然后我只想调用该方法,但由于Graphics g参数,它无法正常工作。所以我看到了类似的问题,有人建议使用布尔值Java 按JButton绘制球,球不可见,java,Java,所以,每当用户按下JButton时,我想画一个球。我的问题是,调用revalidate()和repaint()后,球不可见。我忘了什么吗? 这是我的代码,我有另一个用于队列和堆栈的类,这就是我扩展Queueue的原因。我的按钮是可见的,当我按下它们时,我知道它们会工作,球不会出现在屏幕上。早些时候,我尝试在ActionListener中使用void paintComponent,但它无法工作。然后我只想调用该方法,但由于Graphics g参数,它无法正常工作。所以我看到了类似的问题,有人建议使
public class Main extends Queueue {
static boolean clicked = false;
public void paintComponent(Graphics g) {
if(clicked) {
g.setColor(Color.BLACK);
g.fillOval(60, 60, 15, 15);
}
}
public static void main (String[] args) {
Queueue qq = new Queueue();
JFrame f = new JFrame();
JPanel p = new JPanel();
JButton b1 = new JButton("Queue");
JButton b2 = new JButton("Stack");
JButton b3 = new JButton("Ball");
f.setSize(700, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
p.setBackground(Color.RED);
p.add(b1);
p.add(b2);
p.add(b3);
f.add(p);
f.setVisible(true);
b1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
qq.Q();
}
});
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
qq.S();
}
});
b3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
clicked = true;
f.revalidate();
f.repaint();
}
});
你有一些语法错误,我纠正了。我还对其进行了精简,以便更清楚地演示该过程。这是一个工作版本,只是画球
public class Main extends JPanel {
static boolean clicked = false;
public static void main(String[] args) {
JFrame f = new JFrame();
Main m = new Main();
JButton b3 = new JButton("Ball");
f.setSize(700, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(m);
m.add(b3);
f.setVisible(true);
b3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
clicked = true;
f.repaint();
}
});
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (clicked) {
g.setColor(Color.BLACK);
g.fillOval(60, 60, 15, 15);
}
}
}
- 您的类应该扩展
JPanel
- 将其添加到
JFrame
- 将
添加到JButton
实例Main
- 在
中,首先调用paintComponent
super.paintComponent(g)
JPanel
中,而不是作为Queueue
中的方法
public class Main extends Queueue {
static boolean clicked = false;
public static void main(String[] args) {
JFrame f = new JFrame();
Main m = new Main();
JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (clicked) {
g.setColor(Color.BLACK);
g.fillOval(60, 60, 15, 15);
}
}
};
JButton b3 = new JButton("Ball");
f.setSize(700, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(panel);
panel.add(b3);
f.setVisible(true);
b3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
clicked = true;
f.repaint();
}
});
}
}
您正在一个甚至没有实例化的类上定义
paintComponent
。若要用于绘制组件,paintcComponent
必须在添加到框架的图形组件上定义。我在这个类中需要另一个类。这就是为什么我不能扩展JPanel,因为我已经扩展了另一个类。有什么方法可以修复它吗?Queueue扩展了JPanel吗?没有,Queueue没有扩展任何其他类。我的queueue类仅用于在其中创建堆栈和队列。我编辑了我的答案。在结尾处查看新代码。您需要自己添加其他按钮。我还有一个问题,希望您能回答。所以现在我的JPanel没有背景,所以我所做的是将背景添加到我的Jframe中,它工作得很好,但我的问题是,为什么背景消失了?p、 挫折地面(颜色:红色);不工作,但当我将其更改为f.setBackground(颜色为红色)时;它很好用。我通常在JPanel上设置背景,而不是JFrame