Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-重画背景_Java_Graphics_Awt - Fatal编程技术网

Java-重画背景

Java-重画背景,java,graphics,awt,Java,Graphics,Awt,我想用不同的图像重画背景。这里有一个SSCCE示例-我想向侦听器添加一个操作,该操作将使用另一个图像重新绘制 package painting; import javax.swing.SwingUtilities; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.BorderFactory; import java.awt.Color; import java.awt.Dimension; imp

我想用不同的图像重画背景。这里有一个SSCCE示例-我想向侦听器添加一个操作,该操作将使用另一个图像重新绘制

package painting;

import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseMotionAdapter;

public class SwingPaintDemo3 {

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI(); 
        }
    });
}

private static void createAndShowGUI() {
    System.out.println("Created GUI on EDT? "+
    SwingUtilities.isEventDispatchThread());
    JFrame f = new JFrame("Swing Paint Demo");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(new MyPanel());
    f.pack();
    f.setVisible(true);
} 
}

class MyPanel extends JPanel {

private int squareX = 50;
private int squareY = 50;
private int squareW = 20;
private int squareH = 20;
Image img;

public MyPanel() {

    setBorder(BorderFactory.createLineBorder(Color.black));

    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            moveSquare(e.getX(),e.getY());
        }
    });

    addMouseMotionListener(new MouseAdapter() {
        public void mouseDragged(MouseEvent e) {
            moveSquare(e.getX(),e.getY());
        }
    });

}

private void moveSquare(int x, int y) {
    int OFFSET = 1;
    if ((squareX!=x) || (squareY!=y)) {
        repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
        squareX=x;
        squareY=y;
        repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET);
    } 
}


public Dimension getPreferredSize() {
    return new Dimension(250,200);
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);      
try {
    img = ImageIO.read(new File("graphics/close_0.jpg"));
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
    g.drawImage(img, 0, 0, null); 
    g.drawString("This is my custom Panel!",10,20);
    g.setColor(Color.RED);
    g.fillRect(squareX,squareY,squareW,squareH);
    g.setColor(Color.BLACK);
    g.drawRect(squareX,squareY,squareW,squareH);
}  
}

那么,我应该调用什么方法来重画不同图像的背景呢?

据我所知,这个源代码可能会引导您前进。请注意,代码应绝不尝试在
paint
paintComponent
方法中进行可能的阻塞操作(如加载图像)

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import java.util.Random;

public class SwingPaintDemo3 {

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}

private static void createAndShowGUI() {
    System.out.println("Created GUI on EDT? "+
    SwingUtilities.isEventDispatchThread());
    JFrame f = new JFrame("Swing Paint Demo");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new MyPanel());
    f.pack();
    f.setVisible(true);
}
}

class MyPanel extends JPanel {

private int squareX = 50;
private int squareY = 50;
private int squareW = 20;
private int squareH = 20;
Image img;
Random r = new Random();

public MyPanel() {
    img = new BufferedImage(40,40,BufferedImage.TYPE_INT_RGB);

    setBorder(BorderFactory.createLineBorder(Color.black));

    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            img = new BufferedImage(
                r.nextInt(getWidth())+1,
                r.nextInt(getHeight())+1,
                BufferedImage.TYPE_INT_RGB);
            moveSquare(e.getX(),e.getY());
        }
    });
}

private void moveSquare(int x, int y) {
    int OFFSET = 1;
    if ((squareX!=x) || (squareY!=y)) {
        squareX=x;
        squareY=y;
        repaint();
    }
}


public Dimension getPreferredSize() {
    return new Dimension(250,200);
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    g.drawImage(img, 0, 0, null);
    g.drawString("This is my custom Panel!",10,20);
    g.setColor(Color.RED);
    g.fillRect(squareX,squareY,squareW,squareH);
    g.setColor(Color.BLACK);
    g.drawRect(squareX,squareY,squareW,squareH);
}
}

为了更快地获得更好的帮助,可以发布一个(而不是3个单独的源文件)。
Graphics g=screen.getGraphics()嗯。你在看什么代码让你产生了这个想法?扔掉它。请看如何正确操作。我会尽力解释。在方法paintComponent(Graphics g)中有一行:g.drawImage(img,0,0,null);它将图像绘制为背景。在我的示例中,图像是文件close_0.jpg。我想用不同的图像绘制新的背景——比如说在按下鼠标后xyz.jpg。嗯,是的。这正是被改变的来源所做的。谢谢你的帮助和时间