2017-02-10 6 views
1

J'ai créé ce code qui est censé dessiner certaines choses quand j'ai sélectionné un bouton radio sur un JForm, j'ai utilisé NetBeans pour créer l'interface graphique. Lorsque je sélectionne un bouton radio, rien ne se passe. J'ai essayé de comprendre ce qui ne va pas pendant un moment, mais je n'arrive toujours pas à trouver une solution, c'est pourquoi je suis venu ici. Si quelqu'un pouvait repérer une erreur, je serais reconnaissant.Dessiner des formes sur un JForm java

public class DrawShapesGUI extends javax.swing.JFrame { 

private int figureID; 

public DrawShapesGUI() { 
    initComponents(); 
    repaint(); 
} 

@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"></editor-fold>       

private void lineButtonActionPerformed(java.awt.event.ActionEvent evt) {           
    int figureID = 1; 
    repaint(); 
}           

private void rectButtonActionPerformed(java.awt.event.ActionEvent evt) {           
    int figureID = 2; 
    repaint(); 
}           

private void ovalButtonActionPerformed(java.awt.event.ActionEvent evt) {           
    int figureID = 3; 
    repaint(); 
}           

private void arcButtonActionPerformed(java.awt.event.ActionEvent evt) {           
    int figureID = 4; 
    repaint(); 
}           

private void polygonButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    int figureID = 5; 
    repaint(); 
}            



public static void main(String args[]) { 
    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new DrawShapesGUI().setVisible(true); 
     } 
    }); 

} 
@Override 
public void paint(Graphics g) { 
    super.paint(g); 
    g.setColor(Color.red); 

    if (figureID == 1) { 
     g.drawLine(50, 50, 100, 100); 
    } else if (figureID == 2) { 
     g.fillRect(50, 50, 100, 100); 
    } else if (figureID == 3) { 
     g.fillOval(100, 100, 100, 60); 
    } else if (figureID == 4) { 
     g.drawArc(50, 50, 200, 200, 90, 30); 
    } else if (figureID == 5) { 
     Polygon poly = new Polygon(); 
     poly.addPoint(100, 50); 
     poly.addPoint(150, 50); 
     poly.addPoint(200, 100); 
     poly.addPoint(150, 150); 
     poly.addPoint(100, 150); 
     poly.addPoint(50, 100); 
     g.fillPolygon(poly); 
    } 
} 
+1

* "Si quelqu'un pouvait repérer une erreur que je serais reconnaissant. "* Un' JFrame' fait partie de Java. Un JForm est connu uniquement de votre IDE. Parlez Java, pas Netbeans. –

Répondre

3

Je vois quelques problèmes dans votre code:

  1. Vous étendons JFrame, vous ne devriez pas faire cela, parce que cela peut être lu comme DrawShapesGUIest unJFrame, JFrame est un conteneur rigide, créez plutôt votre GUI basé sur JPanel s. Voir Java Swing using extends vs calling it inside of class pour plus d'informations.

  2. Vous avez un membre appelé figureID mais vous ne jamais l'utiliser parce que chaque fois que vous créez une nouvelle variable locale figureID dans chaque méthode « ActionPerformed »:

    int figureID = 5; 
    

    Retirez int de chacune de ces phrases, c'est probablement votre problème de pourquoi rien ne se passe.

  3. Vous remplacez la méthode paint() et vous devez remplacer paintComponent() à la place. Cependant je dois vous féliciter pour appeler au moins super.paint(g).

  4. Pas un problème du tout, mais une amélioration consiste à utiliser l'API Shapes pour dessiner les formes au lieu d'appeler g.drawLine() et tous ces appels.

  5. Vous utilisez le java.awt.EventQueue.invokeLater() qui devrait être changé en tant que version 1.3 de Java pour SwingUtilities.invokeLater() (encore une fois juste une amélioration)

  6. Vous pouvez améliorer vos ActionListener s une meilleure façon avec une seule méthode et les conditions à l'intérieur il.


En prenant en considération les points ci-dessus, je fait ce nouveau programme qui produit cette sortie:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Polygon; 
import java.awt.Shape; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Arc2D; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Line2D; 
import java.awt.geom.Rectangle2D; 

import javax.swing.ButtonGroup; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.SwingUtilities; 

@SuppressWarnings("serial") 
public class DrawShapesGUI { 

    private JFrame frame; 

    private JRadioButton lineButton; 
    private JRadioButton rectButton; 
    private JRadioButton ovalButton; 
    private JRadioButton arcButton; 
    private JRadioButton polygonButton; 

    private ButtonGroup group; 

    private JPanel pane; 
    private CustomShape renderShape; 

    private Shape shape; 

    private ActionListener listener = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource().equals(lineButton)) { 
       shape = new Line2D.Double(50, 50, 100, 100); 
       renderShape.setShape(shape); 
      } else if (e.getSource().equals(rectButton)) { 
       shape = new Rectangle2D.Double(50, 50, 100, 100); 
       renderShape.setShape(shape); 
      } else if (e.getSource().equals(ovalButton)) { 
       shape = new Ellipse2D.Double(100, 100, 100, 60); 
       renderShape.setShape(shape); 
      } else if (e.getSource().equals(arcButton)) { 
       shape = new Arc2D.Double(50, 50, 200, 200, 90, 30, Arc2D.OPEN); 
       renderShape.setShape(shape); 
      } else if (e.getSource().equals(polygonButton)) { 
       Polygon poly = new Polygon(); 
       poly.addPoint(100, 50); 
       poly.addPoint(150, 50); 
       poly.addPoint(200, 100); 
       poly.addPoint(150, 150); 
       poly.addPoint(100, 150); 
       poly.addPoint(50, 100); 
       shape = poly; 
       renderShape.setShape(shape); 
      } 
     } 
    }; 

    public static void main(String args[]) { 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, 
        ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, 
        ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, 
        ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, 
        ex); 
     } 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new DrawShapesGUI().createAndShowGUI(); 
      } 
     }); 
    } 

    class CustomShape extends JPanel { 
     private Shape shape; 

     public Shape getShape() { 
      return shape; 
     } 

     public void setShape(Shape shape) { 
      this.shape = shape; 
      revalidate(); 
      repaint(); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 

      if (shape != null) { 
       g2d.setColor(Color.RED); 
       if (shape instanceof Line2D || shape instanceof Arc2D) { 
        g2d.draw(shape); 
       } else { 
        g2d.fill(shape); 
       } 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(150, 200); 
     } 
    } 

    public void createAndShowGUI() { 
     frame = new JFrame(getClass().getSimpleName()); 

     lineButton = new JRadioButton("Line"); 
     rectButton = new JRadioButton("Rectangle"); 
     ovalButton = new JRadioButton("Oval"); 
     arcButton = new JRadioButton("Arc"); 
     polygonButton = new JRadioButton("Polygon"); 

     lineButton.addActionListener(listener); 
     rectButton.addActionListener(listener); 
     ovalButton.addActionListener(listener); 
     arcButton.addActionListener(listener); 
     polygonButton.addActionListener(listener); 

     group = new ButtonGroup(); 

     group.add(lineButton); 
     group.add(rectButton); 
     group.add(ovalButton); 
     group.add(arcButton); 
     group.add(polygonButton); 

     pane = new JPanel(); 
     pane.add(lineButton); 
     pane.add(rectButton); 
     pane.add(ovalButton); 
     pane.add(arcButton); 
     pane.add(polygonButton); 

     renderShape = new CustomShape(); 

     frame.add(pane, BorderLayout.PAGE_START); 
     frame.add(renderShape, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+0

Merci beaucoup pour la bonne explication, désolé de répondre tard. Maintenant, je sais ce que j'ai fait de mal. – hDDen

+0

@hDDen Je suis content d'être utile :) – Frakcool