为什么在 paintComponent(Graphics g) 方法中使用 if 语句会使方法中的所有代码无效?

Why using an if statement inside a paintComponent(Graphics g) method invalidates all code inside the method?

我正在尝试创建一个包含 JPanel 对象的 JFrame 对象。在 JPanel 对象内部有 3 个 JButton,单击它们可更改 JPanel 的背景颜色。

我还想绘制一个大小等于 JPanel 对象的图像,以给人一种背景图像的印象,但正如您可能想象的那样,我希望它只在第一次被淹没,当用户没有'尚未单击任何按钮。单击按钮后,我打算调用从 Component class 继承的 repaint() 方法,根据我的理解,它应该调用 paintComponent(Graphics g)。

鉴于我希望仅当用户未单击任何按钮时才绘制图像,在 paintComponent(Graphics g) 中,我尝试使用 if 语句,因此当 paintComponent(Graphics g)方法由 repaint() 方法第二次调用,它将在 else 语句中执行并简单地调用 super.paintComponent(Graphics g) 方法,据我所知,应该在没有图像的情况下绘制它。问题是,一旦我将 if 语句放入 paintComponent 方法中,它似乎就会使方法中的整个代码无效。

任何关于为什么会发生这种情况的建议或解释将不胜感激。

代码如下:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;   
import javax.swing.*;

public class PruebaEventosSelf {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MarcoBotonSelf marco=new MarcoBotonSelf();
        marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}


class MarcoBotonSelf extends JFrame{

    public MarcoBotonSelf() {
        setExtendedState(MarcoBotonSelf.MAXIMIZED_BOTH);
        setTitle("National Aeronautics and Space Administration NASA");
        Image image=Toolkit.getDefaultToolkit().getImage("C:\Users\wagne\OneDrive\Desktop\Nasa.png");
        setIconImage(image);
        LaminaBoton lamina=new LaminaBoton();
        add(lamina);
        setVisible(true);
    }
}

class LaminaBoton extends JPanel implements ActionListener {

    JButton botonAzul=new JButton("Blue");
    JButton botonNegro=new JButton("Black");
    JButton botonGris=new JButton("Gris");
    boolean repaint=false;

    public LaminaBoton() {
        botonAzul.addActionListener(this);
        add(botonAzul, Container.CENTER_ALIGNMENT);
        botonNegro.addActionListener(this);
        add(botonNegro, Container.LEFT_ALIGNMENT);
        botonGris.addActionListener(this);
        add(botonGris, Container.CENTER_ALIGNMENT);
    }

    public void paintComponent(Graphics g) {
        if(repaint) {
            super.paintComponent(g);
        }else {
            Image imagen=Toolkit.getDefaultToolkit().getImage("C:\Users\wagne\OneDrive\Desktop\NASA.jpg");
            g.drawImage(imagen, 0, 0, this);
        }
    }

    public void actionPerformed(ActionEvent e) {
        Object pulsado=e.getSource();
        if (pulsado==botonAzul){
            repaint=true;
            repaint();
            this.setBackground(Color.blue);
            System.out.println("Blue is working!");
        }else if(pulsado==botonNegro) {
            System.out.println("Black is working!");
            setBackground(Color.BLACK);
        }else {
            System.out.println("Gray is working!");
            setBackground(Color.DARK_GRAY);
        }
    }

}

这是我试过的另一种方法:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;  
import javax.swing.*;

public class PruebaEventosSelf {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MarcoBotonSelf marco=new MarcoBotonSelf();
        marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}


class MarcoBotonSelf extends JFrame{

    public MarcoBotonSelf() {
        setExtendedState(MarcoBotonSelf.MAXIMIZED_BOTH);
        setTitle("National Aeronautics and Space Administration NASA");
        Image image=Toolkit.getDefaultToolkit().getImage("C:\Users\wagne\OneDrive\Desktop\Nasa.png");
        setIconImage(image);
        LaminaBoton lamina=new LaminaBoton();
        add(lamina);
        setVisible(true);
    }
}

class LaminaBoton extends JPanel implements ActionListener {

    JButton botonAzul=new JButton("Blue");
    JButton botonNegro=new JButton("Black");
    JButton botonGris=new JButton("Gris");
    boolean repaint=false;

    public LaminaBoton() {
        botonAzul.addActionListener(this);
        add(botonAzul, Container.CENTER_ALIGNMENT);
        botonNegro.addActionListener(this);
        add(botonNegro, Container.LEFT_ALIGNMENT);
        botonGris.addActionListener(this);
        add(botonGris, Container.CENTER_ALIGNMENT);
    }

    public void paintComponent(Graphics g) {
        Image imagen=Toolkit.getDefaultToolkit().getImage("C:\Users\wagne\OneDrive\Desktop\NASA.jpg");
        g.drawImage(imagen, 0, 0, this);
        if (repaint) super.paintComponent(g);
    }

    public void actionPerformed(ActionEvent e) {
        Object pulsado=e.getSource();
        if (pulsado==botonAzul){
            repaint=true;
            repaint();
            this.setBackground(Color.blue);
            System.out.println("Blue is working!");
        }else if(pulsado==botonNegro) {
            System.out.println("Black is working!");
            setBackground(Color.BLACK);
        }else {
            System.out.println("Gray is working!");
            setBackground(Color.DARK_GRAY);
        }
    }

}

我尝试了另外 4 种不同的方法,但它们似乎都会导致相同的结果,即使用户没有点击任何按钮,图像也不会被淹没。

您的 paintComponent() 方法应始终调用 super.paintCompnent(g); 作为方法中的第一条语句。然后它应该只在 repaint 变量为 false 时绘制图像。

调用该变量 paintImage 并将其初始设置为 true,然后按钮侦听器将其设置为 false,并且仅当 paintImage 为 true 时,paintComponent() 方法才绘制图像会更好 - 并且更具逻辑可读性.