在JForm java上绘制形状

时间:2017-02-10 11:21:11

标签: java swing user-interface actionlistener custom-painting

我已经创建了这个代码,当我在JForm上选择一个单选按钮时应该绘制某些东西,我已经使用NetBeans来创建GUI。当我选择单选按钮时没有任何反应。我一直试图弄清楚什么是错的,但我仍然无法找到解决方案,这就是我来到这里的原因。如果有人能发现错误,我会感激不尽。

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 个答案:

答案 0 :(得分:3)

我在你的代码中看到了一些问题:

  1. 您正在延长JFrame,您不应该这样做,因为这可以像DrawShapesGUI JFrame一样阅读, JFrame是一个严格的容器,而是基于JPanel创建GUI。有关详细信息,请参阅Java Swing using extends vs calling it inside of class

  2. 您有一个名为figureID的成员,但您永远不会使用它,因为每次在每个“figureID”方法中创建一个新的局部变量ActionPerformed时:

    int figureID = 5;
    

    从这些句子中移除int,这可能就是为什么没有发生任何事情的问题。

  3. 您正在覆盖paint()方法,而您应该覆盖paintComponent()。但是,我必须祝贺你至少打电话给super.paint(g)

  4. 根本不是问题,但改进之处在于使用Shapes API绘制形状而不是调用g.drawLine()以及所有这些调用。

  5. 您正在使用java.awt.EventQueue.invokeLater(),因为Java版本1.3应更改为SwingUtilities.invokeLater()(再次只是改进)

  6. 只需一种方法和条件,您就可以更好地改进ActionListener

  7. 考虑到以上几点,我制作了这个产生这个输出的新程序:

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