当前位置: 首页 > 面试题库 >

在JForm Java上绘制形状

袁博
2023-03-14
问题内容

我创建了此代码,当我
在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 为a JFrame,JFrame是一个刚性容器,而是基于JPanels创建您的GUI 。有关更多信息,请参见使用Exting vs在类内部调用Java Swing。

  2. 您有一个称为的成员,figureID但您从未使用过它,因为每次figureID在每个“ ActionPerformed”方法中创建一个新的局部变量时:

    int figureID = 5;
    

int从每个句子中删除,可能这就是为什么什么都没发生的问题。

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

    1. 根本不是问题,但是一种改进是使用Shapes API绘制形状而不是调用g.drawLine()和所有这些调用。

    2. 您正在使用java.awt.EventQueue.invokeLater()应将Java 1.3版本更改为SwingUtilities.invokeLater()(再次改进)

ActionListener仅使用其中的一种方法和条件,就可以以更好的方式改进s。

考虑到以上几点,我制作了一个新程序,该程序产生以下输出:

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


 类似资料:
  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 改善这个问题 我想用Java绘制图形(节点和边)。但是,由于我不知道该怎么做,因此在开始之前我想寻求一些建议。 我应该怎么做? 使用Graphics2D包,对吗? 节点的标签怎么样?我应该使用诸如drawString之类的东西并手动处理所有“

  • 我有一个JavaFX TabPane,其中我放置了一个按钮作为选项卡选择器。所以我可以在按钮上画形状。当我像这样画一个简单的多边形时,一切都很好: 但是我想要一个这样的多边形: 当我尝试使用5个角坐标时,只有我的第一个示例正在绘制。我需要更改什么才能绘制底部的线?是否可以使用多边形?还是我需要使用其他东西?

  • 通过 Entity 添加形状 先来看一个添加立方体的例子 var viewer = new Cesium.Viewer('cesiumContainer'); var redBox = viewer.entities.add({ name : 'Red box with black outline', position: Cesium.Cartesian3.fromDegrees(-107

  • 使用closePath()闭合图形 首先我们用上节课的方法绘制一个矩形。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT

  • 问题内容: 我正在尝试构建 Paint 应用程序,并且在DrawingArea类中做错了什么。问题是当我尝试绘制第二个形状时,第一个形状或图形是自动删除的,因此我需要一些解决方法的想法。所有答案都可以接受。感谢帮助。 有部分 DrawingArea.class 代码: 问题答案: 您需要: 将要绘制的形状存储在列表中,然后在paintComponent()方法中绘制列表中的所有形状,或者 将形状绘

  • 问题内容: 我需要知道如何在画布上绘制多边形。不使用jQuery或类似的东西。 问题答案: 使用和创建一个路径: