刚刚开始搞乱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()
。