Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
461 views
in Technique[技术] by (71.8m points)

swing - Drawing shapes on a JForm java

I have created this code that is supposed to draw certain things when I selected a radio button on a JForm, I have used NetBeans to create the GUI. When I select a radio button nothing happens. I have been trying to figure out what's wrong for a while but I still cannot find a solution that's why I came here. If anyone could spot a mistake I would be thankful.

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);
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I see some problems in your code:

  1. You're extending JFrame, you shouldn't be doing this, because this can be read like DrawShapesGUI is a JFrame, JFrame is a rigid container, instead create your GUI based on JPanels. See Java Swing using extends vs calling it inside of class for more information.

  2. You have a member called figureID but you're never using it because every time you create a new local variable figureID in each "ActionPerformed" method:

    int figureID = 5;
    

    Remove int from each of those sentences, probably that's your problem of why nothing is happening.

  3. You're overriding paint() method and you should be overriding paintComponent() instead. However I must congratulate you for at least be calling super.paint(g).

  4. Not a problem at all, but an improvement is to use the Shapes API to draw the shapes instead of calling g.drawLine() and all of those calls.

  5. You're using the java.awt.EventQueue.invokeLater() which as version 1.3 of Java should be changed to SwingUtilities.invokeLater() (again just an improvement)

  6. You can improve your ActionListeners in a better way with only one method and conditions inside it.


Taking in consideration the above points I made this new program which produces this output:

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);
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...