Почему использование оператора if внутри метода paintComponent (Graphics g) делает недействительным весь код внутри метода? - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь создать объект JFrame, который содержит объект JPanel. Внутри объекта JPanel есть 3 кнопки J, которые при нажатии предназначены для изменения цвета фона JPanel.

Я также хочу нарисовать изображение, размер которого равен размеру объекта JPanel, чтобы создать впечатление фонового изображения, но, как вы можете себе представить, я хочу, чтобы оно тонуло только в первый раз, когда пользователь пока не нажимал ни на какие кнопки. Как только кнопка нажата, я собираюсь вызвать метод repaint (), унаследованный от класса Component, который в моем понимании должен сделать вызов 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 разных способа, но все они, кажется, приводят к тот же самый результат того, что изображение не утонуло, даже если пользователь не нажал ни одной кнопки.

1 Ответ

0 голосов
/ 20 февраля 2020

Ваш метод paintComponent () должен ВСЕГДА вызывать super.paintCompnent(g); в качестве первого оператора в методе. Тогда он должен рисовать изображение только в том случае, если переменная перерисовки имеет значение false.

Было бы лучше - и более логически читаемым - вызвать эту переменную paintImage и установить ее изначально в значение true, тогда слушатель кнопки устанавливает ее в значение false и метод paintComponent () dr aws изображение, только если paintImage имеет значение true.

...