Java 更新面板的背景图像

Java 更新面板的背景图像,java,swing,user-interface,jpanel,Java,Swing,User Interface,Jpanel,当我想更改“面板”的背景时,我在更新“面板”时遇到问题 在我的程序中,每当你在面板中点击一定次数时,面板就会改变它的背景,但我很难做到这一点 这是我的密码 这是构造函数/gui类 import java.awt.*; import javax.swing.*; import javax.swing.text.*;; public class demo { JFrame frame = new JFrame ("Idle Game Test!"); JPanel backGroundPanel

当我想更改“面板”的背景时,我在更新“面板”时遇到问题

在我的程序中,每当你在面板中点击一定次数时,面板就会改变它的背景,但我很难做到这一点

这是我的密码

这是构造函数/gui类

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;;

public class demo {

JFrame frame = new JFrame ("Idle Game Test!");
JPanel backGroundPanel = new JPanel ();
static JPanel statusPanel = new JPanel();
JPanel buttonPanel = new JPanel ();
JPanel bigPanel = new JPanel ();
static JTextArea message = new JTextArea (34,43);

//MessageDisplay msg = new MessageDisplay ();

//Constructor

demo () {

    //gets the dimension of the screen
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    backGroundClass bgc = new backGroundClass ();


    frame.setSize (850,700);
    frame.setResizable (false);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible (true);

    //get size in pixels
    int w = frame.getSize().width;
    int h = frame.getSize().height;
    int x = (dim.width - w)/2;
    int y = (dim.height - h)/2;
    //set the location
    frame.setLocation (x,y);

    backGroundPanel.setLayout (null);
    backGroundPanel.setBackground (Color.DARK_GRAY);
    frame.add (backGroundPanel);

    statusPanel.setSize(250, 600);
    statusPanel.setLocation (15,55);
    statusPanel.add(bgc.panel);
    statusPanel.addMouseListener(new mouseEvent ());
    backGroundPanel.add (statusPanel);


    buttonPanel.setSize (550,100);
    buttonPanel.setLocation (280,555);
    backGroundPanel.add (buttonPanel);

    JScrollPane scroll = new JScrollPane (message, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

    DefaultCaret caret = (DefaultCaret)message.getCaret();
    caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

    message.setWrapStyleWord(true);
    message.setLineWrap(true);
    message.setBackground (Color.gray);
    message.setEditable (true);
    message.setForeground(Color.white);
    message.setFont(new Font ("Georgia", Font.PLAIN, 12));
    message.setEditable(false);

    //message.setSize (500,500);
    bigPanel.add(scroll);

    bigPanel.setSize (550, 490);
    bigPanel.setLocation (280,55);
    backGroundPanel.add (bigPanel);

}
}
制作带有背景的面板的类

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")
class backGroundClass extends JPanel {

//ImagePanel panel = new ImagePanel(new ImageIcon("images/background.png").getImage());
int controlNumber = 0 ;

String []imagePath= {"Image1Ulquiora.jpg","Image2Diva.jpg","Image2DivaSized.jpg","Image3GirlInSword.jpg"};

ImageIcon icon = new  ImageIcon (getClass().getResource(imagePath[controlNumber]));
ImagePanel panel = new ImagePanel (icon.getImage());
}

    @SuppressWarnings("serial")
    class ImagePanel extends JPanel {

      private Image img;

      public ImagePanel(String img) {
        this(new ImageIcon(img).getImage());
      }

      public ImagePanel(Image img) {
        this.img = img;
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);
      }

      public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, null);
      }
}
以及假设要更新面板的操作事件(我不确定这是否正确或XD是什么)

导入java.awt.event.*;
公共类mouseEvent实现MouseListener{
backGroundClass bgc=新的backGroundClass();
@凌驾
公共无效mouseClicked(MouseEvent e){
如果(!MainProg.flag){
demo.message.append(Integer.toString(例如getClickCount());
}
如果(如getClickCount()>5){
bgc.controlNumber=3;
bgc.panel.repaint();//这不起作用:<
demo.statusPanel.revalidate();//这也是
demo.statusPanel.repaint();//相同
}
}
@凌驾
公共无效鼠标事件(鼠标事件e){
//TODO自动生成的方法存根
}
@凌驾
公共无效mouseExited(MouseEvent e){
//TODO自动生成的方法存根
}
@凌驾
公共无效鼠标按下(MouseEvent e){
//TODO自动生成的方法存根
}
@凌驾
公共无效MouseEvent(MouseEvent e){
//TODO自动生成的方法存根
}
}
我在创建w/背景图像的面板和保存创建图像的面板(冗余XD)上尝试了重新绘制,但不幸的是它们都不起作用

还有其他方法访问这些静态变量吗?我实现它们的方法很有效,但我确实认为还有其他更合适或更好的方法,但我不知道。
我希望有人能帮助我,提前感谢,多加力量

在进行任何自定义绘制之前调用
super.paintComponent
,可能是一个好的开始。此外,通常最好覆盖
getPreferred/Minimum/MaximumSize
您永远不会根据值
controlNumber
绘制任何不同的内容,该值不应直接访问,但应通过setter/getter…1)为了更快地获得更好的帮助,发布(最小完整可验证示例)或(简短、完整、正确的示例)。2)获取图像的一种方法(例如)热链接到.uhm中看到的图像。好啊我真的迷路了。你们说的话我什么也听不懂,伙计们(@MadProgrammer)你能给我举个例子吗?这会帮助我更好地理解XD“伙计们,我从你说的话中什么也得不到?”如果你连问具体的、有针对性的问题都不懂,我怀疑你是否有能力成为一名程序员。
import java.awt.event.*;

public class mouseEvent implements MouseListener {

backGroundClass bgc = new backGroundClass ();
@Override
public void mouseClicked(MouseEvent e) {

    if (!MainProg.flag){
    demo.message.append(Integer.toString(e.getClickCount()));
    }

    if (e.getClickCount() > 5) {
    bgc.controlNumber = 3;
    bgc.panel.repaint(); //this does not work :<
    demo.statusPanel.revalidate(); //this also
    demo.statusPanel.repaint(); //same
    }
}

@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub

}


}