为什么在 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() 方法才绘制图像会更好 - 并且更具逻辑可读性.
我正在尝试创建一个包含 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() 方法才绘制图像会更好 - 并且更具逻辑可读性.