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