gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:18:08 27 4
gpt4 key购买 nike

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

我还想绘制一个大小等于 JPanel 对象的图像,以给人背景图像的印象,但正如您可能想象的那样,我希望它仅在第一次(当用户未单击时)被淹没还没有任何按钮。单击按钮后,我打算调用从 Component 类继承的 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() 方法才会绘制图像,这样会更好,并且逻辑上更易读。

关于java - 为什么在 PaintComponent(Graphics g) 方法中使用 if 语句会使该方法中的所有代码无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60327035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com