当前位置: 首页 > 知识库问答 >
问题:

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

陆甫
2023-03-14

我试图创建一个包含JPanel对象的JFrame对象。在JPanel对象内部有3个JButtons,当单击它们时,它们用于更改JPanel的背景颜色。

假设我希望只有当用户没有单击任何按钮时才绘制图像,在paintComponent(Graphics g)内部,我尝试使用一个if语句,因此当repaint()方法第二次调用paintComponent(Graphics g)方法时,它将在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种不同的方法,但它们似乎都导致相同的结果,图像不会被淹没,即使使用没有点击任何按钮。

共有1个答案

吴靖
2023-03-14

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

更好的方法是调用变量paintImage并首先将其设置为true,然后按钮监听器将其设置为false,paintComponent()方法仅在paintImage为true时绘制图像。

 类似资料:
  • 本文向大家介绍bash脚本中if语句的使用方法,包括了bash脚本中if语句的使用方法的使用技巧和注意事项,需要的朋友参考一下 除了 "if,else" 形式之外,还有其它形式的 "if" 语句: 只有当 condition 为真时,该语句才执行操作,否则不执行操作,并继续执行 "fi" 之后的任何行。 以上 "elif" 形式将连续测试每个条件,并执行符合第一个 真 条件的操作。如果没有条件为真

  • 本文向大家介绍详解Lua中的if语句的使用方法,包括了详解Lua中的if语句的使用方法的使用技巧和注意事项,需要的朋友参考一下  if语句由一个或多个语句组成一个布尔表达式。 语法 Lua编程语言的if语句语法是: 如果布尔表达式的计算结果为代码的if语句为true,那么块将被执行。如果if语句的末尾(右大括号后)布尔表达式计算为false,那么第一组代码将被执行。 Lua程序设计语言假定布尔tr

  • 本文向大家介绍详解Lua中if ... else语句的使用方法,包括了详解Lua中if ... else语句的使用方法的使用技巧和注意事项,需要的朋友参考一下  if 语句后面可以跟一个可选的else语句,当布尔表达式为假该语句执行。 语法 在Lua编程语言中的if ... else语句的语法是: 如果布尔表达式的值为true,那么if代码块将被执行,否则else代码块将被执行。 Lua程序设计语

  • 我试图通过这段代码来展示我对Python的基础知识的了解,并且它可以工作: 我还想通过这段代码展示我对Java基础知识的了解,但它不起作用: 我很困惑,因为这一个确实有效: 你们知道怎么了吗?

  • 问题内容: 我希望这个问题不会太笼统。我知道,要在您上进行绘制,您需要重写该方法,并将所有绘制代码​​放入该方法中。我的问题是为什么!为什么Java似乎不允许/提供使用诸如或方法的绘图?在delphi中,一切都变得如此简单。一定有一个原因我无法弄清楚。 问题答案: 那是因为这就是它的工作方式。它是以此方式设计的。但是我想你的问题是关于“为什么” 请记住,Swing大约在15年前问世。批评之一是该A

  • 本文向大家介绍ASP中if语句、select 、while循环的使用方法,包括了ASP中if语句、select 、while循环的使用方法的使用技巧和注意事项,需要的朋友参考一下 具体的介绍就不多说了,大家看下实例就可以了 考虑后期的便于阅读,呐喊教程小编再为大家整理一下 asp if语句 ①if A then B ②if A then B end if ③if A then B else C e