亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何保存 JPanel 中繪制的線條?

如何保存 JPanel 中繪制的線條?

達令說 2023-06-21 16:38:01
我最初是在尋找一個庫來為java制作“鼠標書寫”或“手寫”簽名。我沒有找到任何東西,所以我只是想讓用戶在 JPanel 上的畫布上繪制,然后他可以選擇保存它、重新繪制它或取消簽名。我遇到的問題是,當我嘗試將繪制的內容保存在畫布中時,我得到一個空的 .jpeg到目前為止我的代碼:import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.awt.image.BufferedImage;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.colorchooser.*;import javax.swing.event.*;import java.awt.geom.Line2D;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.util.logging.Logger;import javax.imageio.ImageIO;public class AES_Encryption extends JFrame implements ActionListener{public BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);//JPanel canvas = new JPanel();    JPanel buttonPanel = new JPanel();    Point lastPos = null;    Point startPos = null;    Point finishPos = null;    Graphics g;    JButton save = new JButton("Save");    JButton cancel = new JButton("Cancel");    JButton clear = new JButton("Clear");    JPanel canvas = new JPanel();    int changer = 1;    String path="";    public AES_Encryption () {        setLocation(100,100);        setSize(600,500);        setTitle("ENCODE SECTION");        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        canvas.setBackground(Color.WHITE);        clear.addActionListener(this);        clear.setActionCommand("clear");        save.addActionListener(this);        save.setActionCommand("Save");        cancel.addActionListener(this);        cancel.setActionCommand("Cancel");
查看完整描述

1 回答

?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

創建線的坐標時,將它們保存在列表中。



            List<Point> points = new ArrayList<>(); // instance field.


            canvas.addMouseMotionListener(new MouseMotionListener () {                      

            public void mouseDragged (MouseEvent m) {

                Point p = m.getPoint() ;

                if (changer==1){

                g.drawLine(lastPos.x, lastPos.y, p.x, p.y) ;

                points.add(lastPos);// add it here.

                }           

                lastPos = p ;


            }   

            public void mouseMoved (MouseEvent m) {}

        });


這是一個例子。您需要確定放置points.add()代碼的位置。在這里查看繪畫示例


編輯:


這是如何在窗口中繪圖的示例。不要在繪畫環境之外使用圖形上下文,例如paintor paintComponent(例外情況是buffered images,etc 不在 之內繪畫EDT)。



    import java.awt.BasicStroke;

    import java.awt.Color;

    import java.awt.Dimension;

    import java.awt.Graphics;

    import java.awt.Graphics2D;

    import java.awt.Point;

    import java.awt.RenderingHints;

    import java.util.List;

    import java.util.Random;

    import java.util.stream.Collectors;

    import java.util.stream.IntStream;


    import javax.swing.JFrame;

    import javax.swing.JPanel;

    import javax.swing.SwingUtilities;


    public class ExampleDrawDemo extends JPanel {


       int        WIDTH  = 600;

       int        HEIGHT = 500;

       JFrame     frame  = new JFrame();

       List<Line> lines;


       public static void main(String[] args) {

          SwingUtilities.invokeLater(() -> new ExampleDrawDemo().start());

       }

       public void start() {

          Random r = new Random();

          Color[] color = {

                Color.RED, Color.BLUE, Color.GREEN, Color.MAGENTA, Color.ORANGE,

                Color.CYAN

          };


          // generate some lines.

          lines = IntStream.range(0, 100).mapToObj(

                i -> new Line(r, color[r.nextInt(color.length)])).collect(

                      Collectors.toList());


          setPreferredSize(new Dimension(600, 500));

          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          frame.add(this);

          frame.pack();

          frame.setLocationRelativeTo(null);

          frame.setVisible(true);

       }


       public void paintComponent(Graphics g) {

          super.paintComponent(g);

          Graphics2D g2d = (Graphics2D) g.create();

          // smooth lines

          g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

                   RenderingHints.VALUE_ANTIALIAS_ON);

          // line thickness

          g2d.setStroke(new BasicStroke(2));


          for (Line line : lines) {

             g2d.setColor(line.color);

             g2d.drawLine(line.start.x, line.start.y, line.end.x, line.end.y);

          }

          g2d.dispose();

       }


       class Line {

          Point start;

          Point end;

          Color color;


          public Line(Random r, Color color) {

             this.color = color;

             start = new Point(r.nextInt(WIDTH), r.nextInt(HEIGHT));

             end = new Point(r.nextInt(WIDTH), r.nextInt(HEIGHT));

          }

       }

    }



查看完整回答
反對 回復 2023-06-21
  • 1 回答
  • 0 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號