在用户选择要在Java中绘制的颜色和形状后,尝试绘制矩形/椭圆

时间:2014-04-23 23:41:23

标签: java swing draw paintcomponent

刚刚开始搞乱GUI。我希望这个程序绘制矩形/圆形(取决于用户点击的内容)并在前一个内部绘制相同的形状,直到达到用户放入文本字​​段的数量。当我运行它时,它似乎永远不会使它成为paintComponent。谢谢你的帮助。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class ShapePanel extends JPanel implements ActionListener {

  JTextField numOfShapes;
  JButton square, circle, black, red, blue;
  boolean isSquare = true;
  boolean isCircle = false;
  boolean isBlack = true;
  boolean isRed = false;
  boolean isBlue = false;
  int num = 0;

 ShapePanel() {

    setLayout( new BorderLayout());

    //Panel 1
    JPanel p1 = new JPanel();
    square = new JButton("Squares");
    p1.add(square);
    square.addActionListener( this );

    circle = new JButton("Circles");
    p1.add(circle);
    circle.addActionListener( this );

    numOfShapes = new JTextField(15);
    p1.add(numOfShapes);
    //numOfShapes.addKeyListener( this );
    add(p1, BorderLayout.NORTH);



    //Panel 3
    JPanel p3 = new JPanel();
    black = new JButton("Black");
    p3.add(black);
    black.addActionListener( this );

    red = new JButton("Red");
    p3.add(red);
    red.addActionListener( this );

    blue = new JButton("Blue");
    p3.add(blue);
    blue.addActionListener( this );
    add(p3, BorderLayout.SOUTH);
}

@Override
public void actionPerformed(ActionEvent ae) {
    String nOfS = numOfShapes.getText();
    System.out.println("made it to action performed");

    if(ae.getSource() == square){
        isSquare = true;
    }
    if(ae.getSource() == circle){
        isCircle = true;
    }
    if(ae.getSource() == black){
        isBlack = true;
    }
    if(ae.getSource() == red){
        isRed = true;
    }
    if(ae.getSource() == blue){
        isBlue = true;
    }
}  


class Paint extends JPanel {

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        JPanel p2 = new JPanel();
        int c = 0;//change in size
        int x1 = 20;
        int x2 = 200;
        int y1 = 20;
        int y2 = 200;
        String nOfS = numOfShapes.getText(); //number of shapes to be drawn
        num = Integer.parseInt(nOfS);

        System.out.println("Made it to paint component");

        if (isBlack){
            g.setColor(Color.BLACK);
            isBlack = false;
        }
        if (isRed){
            g.setColor(Color.RED);
            isRed = false;
        }
        if (isBlue){
            g.setColor(Color.BLUE);
            isBlue = false;
        }

        if (isSquare){
            for(int i = 0; i < num; i++){
                x1+=c;
                y1+=c;
                x2-=c;
                y2-=c;
                g.drawRect(x1, y1, x2, y2);
                c+=10;
            }
            isSquare = false;
        }
        if (isCircle){
            for(int i = 0; i < num; i++){
                x1+=c;
                y1+=c;
                x2-=c;
                y2-=c;
                g.drawOval(x1, y1, x2, y2);
                c+=10;
            }
            isCircle = false;
        }

        add(p2, BorderLayout.CENTER);
    }
  }
}


public class lab14 {
  public static void main(String[] args) {
    JFrame application = new JFrame();
    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    application.setSize(400, 400);
    application.setLocationRelativeTo(null);
    application.setTitle("Shapes");
application.add(new ShapePanel());
    application.setVisible(true);
 }
}

1 个答案:

答案 0 :(得分:2)

建议

  • 我将Paint JPanel重命名为其他内容,因为Paint类名已被用作Java核心类之一。将它重命名为其他东西,比如DrawPanel。
  • 我在DrawPanel类中重写paintComponent(...)并调用super的方法,就像你一样。
  • 我将删除任何更改对象状态的代码,或者从paintComponet中添加组件到GUI。它应该只用于绘画和绘画。
  • 我将一个DrawPanel实例(称为'drawPanel)添加到主JPanel,BorderLayout.CENTER。
  • 我肯定只会将一个ActionListener添加到JButton一次。
  • 在ActionListener中,我在更改状态后调用我的drawPanel实例上的repaint()