簡體   English   中英

在JForm java上繪制形狀

[英]Drawing shapes on a JForm java

我創建了這個代碼,當我在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. 你正在擴展JFrame ,你不應該這樣做,因為這可以讀取,就像DrawShapesGUI 是一個 JFrameJFrame是一個剛性容器,而是基於JPanel創建你的GUI。 有關更多信息,請參閱Java Swing使用extends vs在類內部調用它

  2. 你有一個名為figureID的成員,但你永遠不會使用它,因為每次在每個“ ActionPerformed ”方法中創建一個新的局部變量figureID

     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


考慮到以上幾點,我制作了這個產生這個輸出的新程序:

在此輸入圖像描述

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM