1

所以我最近做了一些java,我遇到了一些问题。我一直在玩 2d 绘图并将图像添加到项目中。

问题是当窗口调整大小时,它会重绘并复制图像。我做了一些解决方法,但它并不理想......那么为什么图像会重复?

之前:http: //i.imgur.com/PmHRZBQ.png

(窗口大小调整)

之后:http: //i.imgur.com/bhsvVZz.png

代码

main.java

import javax.swing.JFrame;


public class main
{
    public static void main(String [] args) throws InterruptedException
    {
        JFrame f = new JFrame("Title");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Canvas testing = new Canvas();

        f.add(testing);
        f.setSize(800, 600);
        f.setVisible(true);
    }
}

画布.java

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Canvas extends JPanel
{
    public void paintComponent (Graphics g)
    {



        super.paintComponent(g);
        this.setBackground(Color.WHITE);

        g.setColor(Color.BLACK);
        g.fillRect(25, 25, 100, 30);

        g.setColor(new Color(190,81,215));
        g.fillRect(25, 68, 10, 10);

        g.setColor(Color.RED);
        g.drawString("Matt is da best", 100, 10);


            try
            {
                BufferedImage image = ImageIO.read(new File("C:/face.png"));
                JLabel picLabel = new JLabel(new ImageIcon(image));
                System.out.println("Added pic");
                add(picLabel);
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }       
    }

}
4

2 回答 2

1
  1. 不要在paintComponent(Graphics)方法中加载图像!它可以声明为类属性并加载到构造函数中。
  2. 也不要在paintComponent方法中添加组件!它将触发重绘。

这应该更可靠地工作..

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class main
{
    public static void main(String [] args) throws InterruptedException
    {
        JFrame f = new JFrame("Title");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Canvas testing = new Canvas();

        f.add(testing);
        f.setSize(800, 600);
        f.setVisible(true);
    }
}

class Canvas extends JPanel
{

    BufferedImage image;

    Canvas() {
        image = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
        JLabel picLabel = new JLabel(new ImageIcon(image));
        System.out.println("Added pic");
        add(picLabel);
    }

    public void paintComponent (Graphics g)
    {
        super.paintComponent(g);
        this.setBackground(Color.WHITE);

        g.setColor(Color.BLACK);
        g.fillRect(25, 25, 100, 30);

        g.setColor(new Color(190,81,215));
        g.fillRect(25, 68, 10, 10);

        g.setColor(Color.RED);
        g.drawString("Matt is da best", 100, 10);
    }
}

其他提示

  • Canvas返回具有首选尺寸和pack()框架,而不是为其设置尺寸。
  • 在 EDT 上启动和更新 Swing GUI。
  • 不要为您的自定义类指定与 J2SE 类相同的名称。这可能会让人感到困惑。也许叫它JCanvas
于 2013-05-14T06:55:03.140 回答
1

看看你的paintComponent方法...

每次paintComponent调用时,您都在创建一个新的JLabel并将其添加回面板...

try
{
    BufferedImage image = ImageIO.read(new File("C:/face.png"));
    JLabel picLabel = new JLabel(new ImageIcon(image));
    System.out.println("Added pic");
    add(picLabel);
}
catch (IOException e)
{
    e.printStackTrace();
}       

这反过来又会产生另一个重绘请求,同步将重新开始。

切勿从任何paint方法中修改任何组件的状态。这将很简单......在你的脸上炸毁......

您应该加载图像并在构造函数或其他方法中添加标签(paintXxx不调用)

在 Swing 中绘画时要记住的重要一点是,您无法控制它。重绘引擎可以根据自己的需要随时更新您的组件,无论是否有您的交互。您可以通过调用 鼓励绘画repaint,但不能保证何时或什么将重新绘画。

于 2013-05-14T06:56:50.943 回答