Java组件上的图像绘制

Java组件上的图像绘制,java,image,swing,jlabel,Java,Image,Swing,Jlabel,我正在尝试创建一个简单的应用程序来绘制图形 package Tests.Drawing; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; impor

我正在尝试创建一个简单的应用程序来绘制图形

package Tests.Drawing;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.border.EtchedBorder;

public class DrawingTest extends JFrame
{
    private Canvas drwArea;
    private JButton btnClear;

    public static void main(String[] args)
    {
        DrawingTest StartForm = new DrawingTest();
        StartForm.setVisible(true);
    }


    public DrawingTest()
    {
        //Window...
        this.setTitle("Drawing objects test00");
        this.setBounds(0,0,510,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(null);
        //Drawing area...
        drwArea = new Canvas();
        drwArea.setBounds(0, 0, 400, 450);      
        drwArea.setBackground(Color.WHITE);
        drwArea.setOpaque(true);
        drwArea.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
        drwArea.addMouseMotionListener(new MouseMotionAdapter()
        {
            @Override
            public void mouseDragged(MouseEvent e)
            {
                //Write code to paint on the image...
            }
        });

        this.getContentPane().add(drwArea);
        //Clear button...
        btnClear = new JButton("Clear");
        btnClear.setBounds(410,50,70,30);
        btnClear.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                //Write code to clear the image...
            }
        });

        this.getContentPane().add(btnClear);

    }

    private class Canvas extends JLabel
    {
        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            //The idea of overriding this method is
            //achieving persistence...
        }
    }

}
我已经看到典型的组件是一个Jlabel(顺便问一下,还有更好的吗?)。使用“getGraphics”方法,我可以使用一个对象,该对象具有多个在组件上绘制的方法。我的问题是,我不想直接在JLabel上绘制,而是希望在图像(内存中)上绘制,绘制完成后,将结果发送给JLabel。我该怎么做?我有点迷路了

提前谢谢

我想在图像上画画(记忆中)

我建议您然后创建一个所需大小的BuffereImage对象,通过在其上调用
createGraphics()
来获取其Graphics2D对象,并使用此Graphics2D对象在其上绘制

绘画完成后,将结果发送给JLabel

然后,只需调用

Icon myIcon = new ImageIcon(myBufferedImage);
然后通过
myLabel.setIcon(myIcon)设置JLabel的图标

您还可以绘制JPanel的paintComponent方法中显示的BuffereImage,如果您希望在程序运行时更新图像,这可能是一种更好的方法。关于这方面的更多信息,请看一些

其他意见:

  • 不要使用通过调用组件上的
    getGraphics()
    获得的图形对象进行绘制。这将返回一个短暂的图形对象,可能会导致图形消失,或者更糟的是,返回NullPointerException。相反,通过直接或间接地在BuffereImage上绘制JPanel的
    paintComponent(…)
    方法(是的,您可以通过
    getGraphics()
    )获取其图形对象),然后在paintComponent方法内将BuffereImage绘制到GUI
  • 虽然空布局和
    setBounds()
    可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

如果您对我的答案有任何疑问,请提问<代码>我已经看到要绘制的典型组件是Jlabel
-您不需要在Jlabel上“绘制”(也就是说,您不需要覆盖paintComponent()来进行绘制)。您可以使用JLabel显示图像图标。如果你想在某样东西上画画,你通常会在
JPanel
BufferedImage
上画画。有关这两种方法的工作示例,请参阅。谢谢!它工作得完美无缺。正是我想要的。遵循您的布局建议。