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

    Disegnare un rettangolo con base e altezza dati in input

    Salve, la traccia dell'esercizio è questa: Scrivere un’applicazione che chieda all’utente di inserire
    la base e l'altezza di un rettangolo in due campi di testo e al click del
    mouse disegni un rettangolo con quelle dimensioni e con il vertice
    nella posizione del puntatore del mouse.
    Pensavo di riuscire a farlo senza problemi ma ogni volta' mi da errori al ClickListener.

    Ditemi se ho sbagliato qualcosa nel codice:
    codice:
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class test 
    {
    
        
      public static void main(String[] args) 
          {
               int FINAL_TEXT=10;
               ActionListener listener= new ClickListener();
               JLabel label= new JLabel("Inserisci la lunghezza della base del rettangolo: ");
               JTextField textbase= new JTextField(FINAL_TEXT);
               JLabel label2= new JLabel("Inserisci la lunghezza dell'altezza del rettangolo");
               JTextField textaltezza= new JTextField(FINAL_TEXT);
               JFrame frame= new JFrame();
               JButton button= new JButton("Invio");
               button.addActionListener(listener);
               frame.setSize(300,400);
               JPanel panel= new JPanel();
               panel.add(label);
               panel.add(textbase);
               panel.add(label2);
               panel.add(textaltezza);
               panel.add(button);
               frame.add(panel);
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setVisible(true);
                 class ClickListener implements ActionListener
                 {
                        public void actionPerformed(ActionEvent event) 
                          {
                                  JFrame frame2= new JFrame();
                                   frame2.setSize(600, 800);
                                   frame2.addMouseListener(new MouseListener() 
                                   {
                                            private Graphics2D g2;
                                            public void mousePressed(MouseEvent event)
                                                  {
                                                          int base;
                                  int altezza;
                                                          base=Integer.parseInt(textbase.getText());
                                  altezza=Integer.parseInt(textaltezza.getText());
                                  int x = event.getX();
                                                          int y = event.getY();
                                                          Rectangle box= new Rectangle(x, y, base, altezza);
                                                          Graphics g = null;
                                                          g2 = (Graphics2D) g;
                                                           g2.draw(box);
                            
                                                      }
                        //Metodi nulli
                               public void mouseReleased(MouseEvent event) {}
                               public void mouseClicked(MouseEvent event) {}
                               public void mouseEntered(MouseEvent event) {}
                               public void mouseExited(MouseEvent event) {}
                         } 
    );
                        frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        frame2.setVisible(true);
                    
                    
                }
                
            }
            
            
     }
    }
    Vi ringrazio anticipatamente. Ps: sono nuovo ma non ho trovato da nessuna parte una discussione per le presentazioni e nessuna discussione in cui l'esercizio fosse molto simile al mio, se una delle due esiste mi scuso anticipatamente.
    Ultima modifica di Antonio181926; 22-01-2018 a 18:45

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Innanzitutto posta il codice tra i tag CODE (non come quoting). E possibilmente con "buona" indentazione.
    Nel frattempo vedo di leggere il codice.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Ho letto un po' il codice. Diverse cose non vanno.

    Innanzitutto è abbastanza "contorto" come annidamento del codice. Dentro il metodo main c'è la definizione di una classe ClickListener (tecnicamente parlando, è una method-local inner-class). Dentro questa classe nel suo actionPerformed c'è una ulteriore anonymous inner-class per il MouseListener.
    Evita questi annidamenti, specialmente se non conosci le inner-class e/o non ne conosci le implicazioni. Tutto il codice andrebbe riscritto meglio.

    L'approccio al disegno comunque non va bene, è sbagliato tecnicamente ma anche concettualmente.
    Non funziona di certo per via del null.

    codice:
    Graphics g = null;
    g2 = (Graphics2D) g;
    g2.draw(box);

    Se g è null .... anche g2 è null! E non puoi invocare nulla su un null, ovviamente.

    Anche se avessi l'oggetto Graphics appropriato, il punto/problema è che il mousePressed (come qualunque altro metodo di listener) NON è il "contesto" appropriato per disegnare qualcosa.

    Dovresti approfondire meglio i concetti sul disegno (custom painting) nei componenti Swing.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    il g=NULL non lo avevo notato, lo avrà corretto da solo Java.
    Comunque si, sono appena agli inizi della parte "grafica" di Java, ho annidato il codice perché non sapevo come far passare il valore della base e dell'altezza al clicklistener e ho pensato che stando tutto nel main il clicklistener riusciva a prendere come variabili il testo che inserivo nello spazio vuoto.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Questo di seguito è un esempio minimale (ho cercato di ridurre il codice il più possibile) che ho scritto al volo per muovere un pallino tramite 4 pulsanti. Prendine spunto.

    codice:
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class DotMoveFrame extends JFrame implements ActionListener {
        private DotMovePanel dotMovePanel = new DotMovePanel();
        private JButton leftButton = new JButton("LEFT");
        private JButton rightButton = new JButton("RIGHT");
        private JButton upButton = new JButton("UP");
        private JButton downButton = new JButton("DOWN");
        private int movement = 5;
    
        public DotMoveFrame() {
            super("Dot Move");
    
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setSize(400, 400);
            setLocationRelativeTo(null);
    
            JPanel controlPanel = new JPanel();
            controlPanel.add(leftButton);
            controlPanel.add(rightButton);
            controlPanel.add(upButton);
            controlPanel.add(downButton);
    
            add(dotMovePanel, BorderLayout.CENTER);
            add(controlPanel, BorderLayout.SOUTH);
    
            leftButton.addActionListener(this);
            rightButton.addActionListener(this);
            upButton.addActionListener(this);
            downButton.addActionListener(this);
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            Object source = e.getSource();
    
            if (source == leftButton) {
                dotMovePanel.moveDot(-movement, 0);
            } else if (source == rightButton) {
                dotMovePanel.moveDot(movement, 0);
            } else if (source == upButton) {
                dotMovePanel.moveDot(0, -movement);
            } else if (source == downButton) {
                dotMovePanel.moveDot(0, movement);
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new DotMoveFrame().setVisible(true);
                }
            });
        }
    }
    codice:
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.geom.Ellipse2D;
    import javax.swing.JPanel;
    
    public class DotMovePanel extends JPanel {
        private int dotX = 100;
        private int dotY = 100;
    
        public void moveDot(int addX, int addY) {
            dotX += addX;
            dotY += addY;
            repaint();   // Richiede il repaint completo del componente!
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
    
            Ellipse2D.Float dot = new Ellipse2D.Float(dotX-4, dotY-4, 8, 8);
    
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.RED);
            g2d.fill(dot);
        }
    }
    Ultima modifica di andbin; 22-01-2018 a 19:56
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2024 vBulletin Solutions, Inc. All rights reserved.