Java 按JButton绘制球,球不可见

Java 按JButton绘制球,球不可见,java,Java,所以,每当用户按下JButton时,我想画一个球。我的问题是,调用revalidate()和repaint()后,球不可见。我忘了什么吗? 这是我的代码,我有另一个用于队列和堆栈的类,这就是我扩展Queueue的原因。我的按钮是可见的,当我按下它们时,我知道它们会工作,球不会出现在屏幕上。早些时候,我尝试在ActionListener中使用void paintComponent,但它无法工作。然后我只想调用该方法,但由于Graphics g参数,它无法正常工作。所以我看到了类似的问题,有人建议使

所以,每当用户按下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)
查看有关如何绘制的更多信息

针对您的评论,以下内容应该有效。主要问题是您需要将paintComponent放在
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