刚刚开始搞乱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);
 }
}

最佳答案

推荐建议


我将Paint JPanel重命名为其他名称,因为Paint类名称已经用作Java核心类之一。将其重命名为DrawPanel。
我将在DrawPanel类中重写paintComponent(...),并像您所做的那样调用super的方法。
我将摆脱任何更改对象状态或从paintComponet内部向GUI添加组件的代码。它应该仅用于绘画和绘画。
我将一个名为`drawPanel的DrawPanel实例添加到主JPanel BorderLayout.CENTER中。
我将确保只将ActionListener添加到JButton一次。
在ActionListener中,更改其状态后,我将在我的drawPanel实例上调用repaint()

10-05 17:51