在JForm Java上绘制形状 [英] Drawing shapes on a JForm java

查看:83
本文介绍了在JForm Java上绘制形状的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了这段代码,当我在JForm上选择单选按钮时,该代码应该绘制某些内容,我已经使用NetBeans创建了GUI。当我选择单选按钮时,没有任何反应。一段时间以来,我一直在试图找出问题所在,但仍然找不到解决方案,这就是我来这里的原因。如果有人发现错误,我将不胜感激。

 公共类DrawShapesGUI扩展了javax.swing.JFrame {

private int FigureID;

public DrawShapesGUI(){
initComponents();
repaint();
}

@SuppressWarnings( unchecked)
// //编辑器折叠defaultstate = collapsed desc =生成的代码>< //编辑器折叠> ;

private void lineButtonActionPerformed(java.awt.event.ActionEvent evt){
int FigureID = 1;
repaint();
}

private void rectButtonActionPerformed(java.awt.event.ActionEvent evt){
int FigureID = 2;
repaint();
}

私人无效rlullButtonActionPerformed(java.awt.event.ActionEvent evt){
int FigureID = 3;
repaint();
}

private void arcButtonActionPerformed(java.awt.event.ActionEvent evt){
int FigureID = 4;
repaint();
}

私人无效的polygonButtonActionPerformed(java.awt.event.ActionEvent evt){
int FigureID = 5;
repaint();
}



public static void main(String args []){
/ *设置Nimbus外观* /
//< editor-fold defaultstate = collapsed desc =外观设置代码(可选)>
/ *如果Nimbus(在Java SE 6中引入)不可用,请保持默认外观。
*有关详细信息,请参见http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
* /
试试{
for(javax.swing .UIManager.LookAndFeelInfo信息:javax.swing.UIManager.getInstalledLookAndFeels()){
if( Nimbus .equals(info.getName())){
javax.swing.UIManager.setLookAndFeel(info .getClassName());
休息时间;
}
}
} catch(ClassNotFoundException ex){
java.util.logging.Logger.getLogger(DrawShapesGUI.class.getName())。log(java.util。 logging.Level.SEVERE,null,例如);
} 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,例如);
}
//< / editor-fold>

/ *创建并显示以下表格* /
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);
}
}


解决方案

I在代码中看到一些问题:


  1. 您正在扩展 JFrame ,您不应该这样做,因为它可以像 DrawShapesGUI JFrame JFrame 是一个刚性容器,而是基于 JPanel s创建GUI。参见

      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)
    公共类DrawShapesGUI {

    私有JFrame框架;

    私有JRadioButton lineButton;
    私人JRadioButton rectButton;
    私人JRadioButton椭圆形按钮;
    私人JRadioButton arcButton;
    私人JRadioButton多边形按钮;

    私人ButtonGroup组;

    JPanel专用窗格;
    私人CustomShape renderShape;

    私人Shape形状;

    私有ActionListener侦听器= 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);
    形状=多边形;
    renderShape.setShape(shape);
    }
    }
    };

    公共静态无效值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());
    休息时间;
    }
    }
    } 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,前
    );
    }
    SwingUtilities.invokeLater(new Runnable(){
    public void run(){
    new DrawShapesGUI()。createAndShowGUI();
    }
    });
    }

    类CustomShape扩展了JPanel {
    private 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(){
    返回新的Dimension(150,200);
    }
    }

    public void createAndShowGUI(){
    frame = new JFrame(getClass()。getSimpleName());

    lineButton = new JRadioButton( Line);
    rectButton = new JRadioButton( Rectangle);
    椭圆按钮=新的JRadioButton( Oval);
    arcButton = new JRadioButton( Arc);
    多边形按钮=新的JRadioButton(多边形);

    lineButton.addActionListener(listener);
    rectButton.addActionListener(listener);
    椭圆按钮.addActionListener(侦听器);
    arcButton.addActionListener(listener);
    多边形按钮.addActionListener(侦听器);

    group = new ButtonGroup();

    group.add(lineButton);
    group.add(rectButton);
    group.add(ovalButton);
    group.add(arcButton);
    group.add(polygonButton);

    窗格= new JPanel();
    pane.add(lineButton);
    pane.add(rectButton);
    pane.add(ovalButton);
    pane.add(arcButton);
    pane.add(polygonButton);

    renderShape = new CustomShape();

    frame.add(窗格,BorderLayout.PAGE_START);
    frame.add(renderShape,BorderLayout.CENTER);
    frame.pack();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    }


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

    解决方案

    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:

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

    这篇关于在JForm Java上绘制形状的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆