Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Java] Disegnare rettangolo in tempo reale

    ho questo JPanel che prende come sfondo una immagine e sul quale posso fare una selezione col mouse:
    codice:
    public class DrawPanel extends JFrame {
    
        private JButton button;
        private JScrollPane scroll;
        private int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
        private int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
    
        public DrawPanel(String path) {
            super("Draw panel");
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            setLayout(new BorderLayout());
            button = new JButton("Capture");
            ImagePanel panel = new ImagePanel(path);
            scroll = new JScrollPane(panel);
            add(scroll, BorderLayout.CENTER);
            add(button, BorderLayout.SOUTH);
        }
    
        private class ImagePanel extends JPanel implements MouseListener, MouseMotionListener {
    
            private BufferedImage buff;
            private Rectangle currentRect;
            private String fileDelete;
            private Graphics g;
            private int xx = 0;
            private int yy = 0;
            private int w = 0;
            private int h = 0;
    
            public ImagePanel(String path) {
                setLayout(new BorderLayout());
                setPreferredSize(new Dimension(width, height));
                fileDelete = path;
                try {
                    buff = ImageIO.read(new File(path));
                    button.addActionListener(new ActionListener() {
    
                        public void actionPerformed(ActionEvent e) {
                            capture(e);
                        }
                    });
                    addMouseListener(this);
                    addMouseMotionListener(this);
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
    
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(buff, 0, 0, this);
            }
    
            public void mousePressed(MouseEvent e) {
                xx = e.getX();
                yy = e.getY();
                currentRect = new Rectangle(xx, yy, 0, 0);
            }
    
            public void mouseDragged(MouseEvent e) {
                currentRect.setSize(e.getX() - currentRect.x, e.getY() - currentRect.y);
                repaint();
            }
    
            public void mouseReleased(MouseEvent e) {
                w = e.getX() - currentRect.x;
                h = e.getY() - currentRect.y;
                currentRect.setSize(w, h);
                repaint();
            }
    
            public void capture(ActionEvent e) {
                try {
                    FileChooserPanel.salva(xx, yy, w, h);
                    DeleteTemp.delete(fileDelete);
                } catch (AWTException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
    
            //metodi che nn servono
            public void mouseClicked(MouseEvent e) {
            }
    
            public void mouseEntered(MouseEvent e) {
            }
    
            public void mouseExited(MouseEvent e) {
            }
    
            public void mouseMoved(MouseEvent e) {
            }
        }
    }
    funziona però manca la visualizzazione dell'area selezionata.
    come posso fare per far vedere l'area selezionata??

  2. #2
    Utente di HTML.it L'avatar di cacao74
    Registrato dal
    Jan 2005
    Messaggi
    2,570
    non ho provato il tuo codice e non so dire come funziona.

    anni addietro, per disegnare in tempo reale (volevo fare un piccolo cad)
    nei metodi relativi agli eventi del mouse:
    - disegno la forma nella posizione vecchia / "cancello" la vecchia (setXORMode di Graphics2D)
    - disegno la forma nella posizione attuale
    solamente nel momento in cui rilascio il tasto del mouse, disegno effettivamente la forma sul pannello (setPaintMode di Graphics2D)

    studiai come disegnare con java sul sito di sun, ora oracle (sezione tutorial)
    slack? smack!

  3. #3
    Originariamente inviato da cacao74
    non ho provato il tuo codice e non so dire come funziona.

    anni addietro, per disegnare in tempo reale (volevo fare un piccolo cad)
    nei metodi relativi agli eventi del mouse:
    - disegno la forma nella posizione vecchia / "cancello" la vecchia (setXORMode di Graphics2D)
    - disegno la forma nella posizione attuale
    solamente nel momento in cui rilascio il tasto del mouse, disegno effettivamente la forma sul pannello (setPaintMode di Graphics2D)

    studiai come disegnare con java sul sito di sun, ora oracle (sezione tutorial)
    questa classe funziona così:
    -il jpanel prende come sfondo una immagine
    -ci sono tre eventi del mouse in modo da selezionare un'area specifica
    -dopo averla selezionata clicchi sul tasto e viene salvata solo quella porzione

    l'unico problema è che nn si vedono i bordi quindi si deve andare a tentativi.
    quindi vorrei ottenere la visualizzazione dei bordi dell'area selezionata.

    grazie per i consigli!

  4. #4
    ho provato con una cosa del genere:
    codice:
    private class ImagePanel extends JPanel implements MouseListener, MouseMotionListener {
    
            private BufferedImage buff;
            private Rectangle currentRect;
            private Rectangle drawRect;
            private String fileDelete;
            private int xx = 0;
            private int yy = 0;
            private int w = 0;
            private int h = 0;
            private int pointCount = 0;
            private Point points[] = new Point[100];
            private Point points2[] = new Point[100];
            private Point start = new Point();
            private Point end = new Point();
    
            public ImagePanel(String path) {
                setLayout(new BorderLayout());
                setPreferredSize(new Dimension(width, height));
                fileDelete = path;
                try {
                    buff = ImageIO.read(new File(path));
                    button.addActionListener(new ActionListener() {
    
                        public void actionPerformed(ActionEvent e) {
                            capture(e);
                        }
                    });
                    addMouseListener(this);
                    addMouseMotionListener(this);
                } catch (IOException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            }
    
            public void mousePressed(MouseEvent e) {
                xx = e.getX();
                yy = e.getY();
                currentRect = new Rectangle(xx, yy, 0, 0);
                start = e.getPoint();
            }
    
            public void mouseDragged(MouseEvent e) {
                currentRect.setSize(e.getX() - currentRect.x, e.getY() - currentRect.y);
                end = e.getPoint();
                drawRect.setFrameFromDiagonal(start, end);
                repaint();
            }
    
            public void mouseReleased(MouseEvent e) {
                w = e.getX() - currentRect.x;
                h = e.getY() - currentRect.y;
                currentRect.setSize(w, h);
                points[pointCount] = start;
                points2[pointCount] = e.getPoint();
                pointCount++;
                drawRect.setFrameFromDiagonal(start, start);
                repaint();
            }
    
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(buff, 0, 0, this);
    
                Graphics2D g2 = (Graphics2D) g;
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                g2.draw(drawRect);
                Rectangle r = new Rectangle();
                for (int i = 0; i < pointCount; i++) {
                    r.setFrameFromDiagonal(points[i], points2[i]);
                    g2.fill(r);
                }
            }
    in avvi ottengo sempre un NullPointerException alla riga:
    g2.draw(drawRect);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.