从JFrame中删除圆圈

时间:2014-12-04 14:59:05

标签: java swing user-interface geometry awt

我正在创建一个河内塔游戏,并且已经延迟打印形状(代码的一部分已被移除,而我试图获取它们应该是的所有椭圆)我想知道如何我会去除圆圈。正如您所看到的,我尝试了clearRect();方法,但这并不起作用。如果方法在JPanel上可见,我可以设置一种方法,因为每个圆都有自己的方法吗?我认为这将是最简单的方法,但如果有人有更好的主意,那就去吧!感谢您的帮助,我附上了我的代码

package towersofhanoi;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.Object;
/*g.fillOval(60 = horizontal distance , 540= vertical distance, 400 = width, 60 = height) */
public class TowersOfHanoi extends JPanel {
private int clock = 0;
private Color circles = new Color(176, 56, 251);

public static void main(String[] args) {
    // Print the shapes and frame
    TowersOfHanoi drawRectangle = new TowersOfHanoi();
    JFrame frame = new JFrame("Towers of Hanoi");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(drawRectangle);
    frame.setSize(1250, 800);
    frame.setVisible(true);

    Timer timer = new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            drawRectangle.nextFrame();
            drawRectangle.repaint();
        }
    });
    timer.setRepeats(true);
    timer.start();
}

public void nextFrame() {
    clock++;
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    frame1(g);
    frame2(g);
    frame3(g);
    frame4(g);
    frame5(g);
    frame6(g);
    frame7(g);
    frame8(g);
    frame9(g);

}

private Color frame1(Graphics g) {
    Color pegs = new Color(251, 129, 56);
    g.setColor(pegs);

    // peg 1
    g.fillRect(250, 300, 25, 450);
    // peg 2
    g.fillRect(600, 300, 25, 450);
    // peg 3
    g.fillRect(950, 300, 25, 450);
    // bottom
    g.fillRect(200, 700, 825, 50);
    // create a color for circles
    // cirle 7 (Labeled from bottom to top)
    g.setColor(circles);
    g.fillOval(60, 640, 400, 60);
    g.setColor(Color.BLACK);
    g.drawOval(60, 640, 400, 60);
    return circles;
}

private void frame2(Graphics g) {
    // circle 6
    g.setColor(circles);
    g.fillOval(85, 580, 350, 60);
    g.setColor(Color.BLACK);
    g.drawOval(85, 580, 350, 60);
}

private void frame3(Graphics g) {
    // circle 5
    g.setColor(circles);
    g.fillOval(110, 520, 300, 60);
    g.setColor(Color.BLACK);
    g.drawOval(110, 520, 300, 60);
}
private void frame4(Graphics g) {
    // circle 4
    g.setColor(circles);
    g.fillOval(135, 465, 250, 55);
    g.setColor(Color.BLACK);
    g.drawOval(135, 465, 250, 55);
}
private void frame5(Graphics g) {
    // circle 3
    g.setColor(circles);
    g.fillOval(160, 420, 200, 45);
    g.setColor(Color.BLACK);
    g.drawOval(160, 420, 200, 45);
}
private void frame6(Graphics g) {
    // circle 2
    g.setColor(circles);
    g.fillOval(185, 380, 150, 40);
    g.setColor(Color.BLACK);
    g.drawOval(185, 380, 150, 40);
}
private void frame7(Graphics g) {
    // circle 1
    g.setColor(circles);
    g.fillOval(210, 345, 100, 35);
    g.setColor(Color.BLACK);
    g.drawOval(210, 345, 100, 35);
}
public void frame8(Graphics g) {
    g.clearRect(210, 345, 100, 35);
    g.setColor(circles);
    g.fillOval(560, 665, 100, 35);
    g.setColor(Color.BLACK);
    g.drawOval(560, 665, 100, 35);
}
public void frame9(Graphics g) {
    g.clearRect(185, 380, 150, 40);
    g.setColor(circles);
    g.fillOval(890, 660, 150, 40);
    g.setColor(Color.BLACK);
    g.drawOval(890, 660, 150, 40);


}


}

2 个答案:

答案 0 :(得分:3)

  

我想知道如何删除圆圈。

super.paintComponent(...)将清除面板上的绘画,以便完全需要。

  

如您所见,我已经尝试过clearRect();

不需要(请参阅上面的评论),但是再次调用fillOval(...)和drawOval(...)方法,以便重做绘画。因此,代码完全按照您的要求执行。

  

如果方法在JPanel

上可见,我可以设置一种方法

你需要一个布尔指示器来告诉paint方法该怎么做。类似的东西:

if (paintOval1)
   frame1(g);
if (paintOval2)
   frame2(g);

当然,这种做法非常蛮力,而且如果说有100个圆圈可以画出来,那就不是一个很好的方法。代码变得太大了。

因此,您应该创建一个包含四个属性(x,y,width,height,isPainted)的自定义类。然后,为每个圆创建此类的实例,并将该类添加到ArrayList。类似的东西:

ArrayList<CustomClass> circles = new ArrayList<CustomClass>();
circles.add( new CustomClass(60, 640, 400, 60, true) );
circles.add( new CustomClass(85, 580, 350, 60, true) );

然后在paintCompnent()方法中,您的代码变得更简单:

for (CustomClass circle: circles.get)
{
    if (circle.isPainted())
    {
        g.setColor(...);
        g.fillOval(circle.getX(), circle,getY(), circle.getWidth(), circle.getHeight());
        ...
    }
}

最后,你需要一种方法来改变画圆的状态。类似的东西:

pubic void setCirclePainted(int circle, Boolean isPainted)
{
    CustomClass circle = circles.get(circle);
    circle.setPainted( isPainted );
}

所以关键在于创建你的&#34; CustomClass&#34;并给它一个正确的名称。然后,您需要实现该类的所有getter / setter方法,以便可以访问该类的属性。

答案 1 :(得分:0)

我实际上发现,让我理解和做的最简单的方法是使用elseelse if语句来显示基于时间的形状。谢谢你的其他建议!

    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    frame1(g);
    frame2(g);
    frame3(g);
    frame4(g);

    if (clock<= 5) {
       frame5(g);
    }
    else if(clock >= 6) {
       frame9(g);
    }
    frame6(g);
    frame7(g);
    frame8(g);


}