为了账号安全,请及时绑定邮箱和手机立即绑定

如何绘制JPanel?(Swing / graphics Java)

/ 猿问

如何绘制JPanel?(Swing / graphics Java)

湖上湖 2019-11-15 10:49:37

我正在一个项目中尝试制作绘画程序。到目前为止,我已经使用Netbeans来创建GUI并设置程序。


到目前为止,我已经能够调用在其中绘制所需的所有坐标,但是我对如何在其中实际绘制感到非常困惑。


在我的代码接近尾声时,我在面板内部进行绘制的尝试失败。


任何人都可以在这样的示例中解释/显示如何使用图形吗?


我发现的所有示例都构成一个类并对其进行扩展,JPanel但是我不知道是否可以这样做,因为它是在netbeans中生成的。


我需要JPanel在我的内部绘制一个JFrame。我不知道将图形类放在哪里。


JavaPaintUI类别

package javapaint;


import java.awt.*;

import javax.swing.*;


public class JavaPaintUI extends javax.swing.JFrame {


public JavaPaintUI() {

    initComponents();

}



private void initComponents() {



    jPanel2 = new javax.swing.JPanel();


    jPanel2.setBackground(new java.awt.Color(255, 255, 255));

    jPanel2.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

    jPanel2.addMouseListener(new java.awt.event.MouseAdapter() {

        public void mousePressed(java.awt.event.MouseEvent evt) {

            jPanel2MousePressed(evt);

        }

        public void mouseReleased(java.awt.event.MouseEvent evt) {

            jPanel2MouseReleased(evt);

        }

    });

    jPanel2.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

        public void mouseDragged(java.awt.event.MouseEvent evt) {

            jPanel2MouseDragged(evt);

        }

    });

    pack();

}// </editor-fold>                        


int currentX, currentY, oldX, oldY;


private void jPanel2MouseDragged(java.awt.event.MouseEvent evt) {                                     

    if (tool == 1) {

        currentX = evt.getX();

        currentY = evt.getY();

        oldX = currentX;

        oldY = currentY;

        System.out.println(currentX + " " + currentY);

        System.out.println("PEN!!!!");

    }


}                                    


private void jPanel2MousePressed(java.awt.event.MouseEvent evt) {                                     

    oldX = evt.getX();

    oldY = evt.getY();

    System.out.println(oldX + " " + oldY);

}                                    

屏幕截图

整个过程是一个JFrame,中间的白色部分jPanel2是我要绘制的。

http://img2.mukewang.com/5dce1255000157fd06680508.jpg

查看完整描述

3 回答

?
回首忆惘然

注意额外的注释。


import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.border.*;


class JavaPaintUI extends JFrame {


    private int tool = 1;

    int currentX, currentY, oldX, oldY;


    public JavaPaintUI() {

        initComponents();

    }


    private void initComponents() {

        // we want a custom Panel2, not a generic JPanel!

        jPanel2 = new Panel2();


        jPanel2.setBackground(new java.awt.Color(255, 255, 255));

        jPanel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));

        jPanel2.addMouseListener(new MouseAdapter() {

            public void mousePressed(MouseEvent evt) {

                jPanel2MousePressed(evt);

            }

            public void mouseReleased(MouseEvent evt) {

                jPanel2MouseReleased(evt);

            }

        });

        jPanel2.addMouseMotionListener(new MouseMotionAdapter() {

            public void mouseDragged(MouseEvent evt) {

                jPanel2MouseDragged(evt);

            }

        });


        // add the component to the frame to see it!

        this.setContentPane(jPanel2);

        // be nice to testers..

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        pack();

    }// </editor-fold>


    private void jPanel2MouseDragged(MouseEvent evt) {

        if (tool == 1) {

            currentX = evt.getX();

            currentY = evt.getY();

            oldX = currentX;

            oldY = currentY;

            System.out.println(currentX + " " + currentY);

            System.out.println("PEN!!!!");

        }

    }


    private void jPanel2MousePressed(MouseEvent evt) {

        oldX = evt.getX();

        oldY = evt.getY();

        System.out.println(oldX + " " + oldY);

    }



    //mouse released//

    private void jPanel2MouseReleased(MouseEvent evt) {

        if (tool == 2) {

            currentX = evt.getX();

            currentY = evt.getY();

            System.out.println("line!!!! from" + oldX + "to" + currentX);

        }

    }


    //set ui visible//

    public static void main(String args[]) {

        EventQueue.invokeLater(new Runnable() {

            public void run() {

                new JavaPaintUI().setVisible(true);

            }

        });

    }


    // Variables declaration - do not modify

    private JPanel jPanel2;

    // End of variables declaration


    // This class name is very confusing, since it is also used as the

    // name of an attribute!

    //class jPanel2 extends JPanel {

    class Panel2 extends JPanel {


        Panel2() {

            // set a preferred size for the custom panel.

            setPreferredSize(new Dimension(420,420));

        }


        @Override

        public void paintComponent(Graphics g) {

            super.paintComponent(g);


            g.drawString("BLAH", 20, 20);

            g.drawRect(200, 200, 200, 200);

        }

    }

}

屏幕截图

//img2.mukewang.com/5dce126f0001ceef04400462.jpg

其他示例-更适合多条线和多条线段

HFOE很好地链接了该主题。Camickr BufferedImage在“ 自定义绘画方法”一文中也对活动绘画与绘画进行了描述。


另请参阅使用绘画中的BufferedImage这种方法。

//img2.mukewang.com/5dce12790001e77205670452.jpg

查看完整回答
反对 回复 2019-11-15
?
蝴蝶刀刀

使用图形用户界面时,您需要记住,窗格上的绘制是在Java AWT / Swing事件队列中完成的。您不能只Graphics在paint()/ paintComponent()/ etc 之外使用该对象。方法。


但是,您可以使用一种称为“ 帧缓冲 ” 的技术。基本上,您需要有一个BufferedImage并直接在其上绘制(请参见其createGraphics()方法;该图形上下文可以保留并在同一BufferedImage实例上重复用于多个操作,而不必一直都在创建新实例时重新创建) 。然后,在您JPanel的paintComponent(),只需要将BufferedImage实例绘制到JPanel。使用这种技术,您可以通过仿射变换非常轻松地执行缩放,平移和旋转操作。


查看完整回答
反对 回复 2019-11-15
?
炎炎设计

这是一个简单的例子。我想这很容易理解:


import java.awt.*;

import javax.swing.JFrame;

import javax.swing.JPanel;


public class Graph extends JFrame {

JFrame f = new JFrame();

JPanel jp;



public Graph() {

    f.setTitle("Simple Drawing");

    f.setSize(300, 300);

    f.setDefaultCloseOperation(EXIT_ON_CLOSE);


    jp = new GPanel();

    f.add(jp);

    f.setVisible(true);

}


public static void main(String[] args) {

    Graph g1 = new Graph();

    g1.setVisible(true);

}


class GPanel extends JPanel {

    public GPanel() {

        f.setPreferredSize(new Dimension(300, 300));

    }


    @Override

    public void paintComponent(Graphics g) {

        //rectangle originates at 10,10 and ends at 240,240

        g.drawRect(10, 10, 240, 240);

        //filled Rectangle with rounded corners.    

        g.fillRoundRect(50, 50, 100, 100, 80, 80);

    }

}

}


输出看起来像这样:

//img2.mukewang.com/5dce128f0001790103060304.jpg

查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信