Рисование фигур на 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 ответ

Решение

Я вижу некоторые проблемы в вашем коде:

  1. Вы расширяете JFrame, вы не должны делать это, потому что это можно прочитать как DrawShapesGUI это JFrame, JFrame это жесткий контейнер, вместо этого создайте свой графический интерфейс на основе JPanels. См. Java Swing с использованием extends против вызова его внутри класса для получения дополнительной информации.

  2. У вас есть член под названием figureID но вы никогда не используете его, потому что каждый раз, когда вы создаете новую локальную переменную figureID в каждом "ActionPerformed"метод:

    int figureID = 5;
    

    Удалить int из каждого из этих предложений, вероятно, это ваша проблема, почему ничего не происходит.

  3. Вы переопределяете paint() метод, и вы должны переопределить paintComponent() вместо. Однако я должен поздравить вас, по крайней мере, для звонка super.paint(g),

  4. Совсем не проблема, но улучшением является использование API форм для рисования фигур вместо вызова g.drawLine() и все эти звонки.

  5. Вы используете java.awt.EventQueue.invokeLater() который как версия 1.3 Java должен быть изменен на 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);
    }
}
Другие вопросы по тегам