1

更新 19/01/14(对于有类似问题的人)
我在下面描述的问题源于我的 circle 类扩展了 JPanel 的事实。所以我从这个类创建的每个圆圈实际上都是它自己的面板。因此,通过添加布局,我可以看到两个圆圈。我现在了解到,它更聪明的是有一个单独的“板类”来扩展 JPanel,并且在这种情况下,让圆圈什么都不扩展。这样我就可以在 circleclass 中实现一个 drawMySelf 方法并将它们绘制在我的板上。这样我就可以在同一个面板中拥有各种几何对象!
更新结束。

我正在做一个需要画两个圆圈的任务。当我调整框架大小时,这些圆圈应该随机重新定位。并且需要在它们的中心之间有一条线来说明距离。我的圈子课遇到了麻烦。当我将自定义圈子添加到我的测试程序时,只出现其中一个。我不知道为什么。我认为我的代码中有一个错误,使程序跳过了一些错误。因为我只会出现一个圆圈。谁能看到这段代码有什么问题?

请记住,我应该使用到目前为止所学的工具。JPanel,JFrame,覆盖paintComponent()。

圈类:

    package oppgave4;
    import javax.swing.*;
    import java.awt.*;

    public class Circle extends JPanel {
    
    public static final int OVAL = 1;
    public static final int ANOTHEROVAL = 2;
    
    public int OVALCENTER = 0;
    public int ANOTHEROVALCENTER = 0;
    
    private int type = 1;
    private boolean filled = false;
    
    public Circle(){
        
    }
    
    public Circle(int type){
        this.type = type;
    }
    
    public Circle(int type, boolean filled){
        this.type = type;
        this.filled = filled;
    }
    
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        
        int width = getWidth();
        int height = getHeight();
        int randomWidth = (int)(width * Math.random());
        int randomHeight = (int)(height * Math.random());
        
        switch (type){
        case OVAL:
            g.setColor(Color.BLUE);
            if(filled)
                g.fillOval(randomWidth, randomHeight, 30, 30);    
            else
                g.drawOval(randomWidth, randomHeight, 30, 30);
      
            
        case ANOTHEROVAL:
            g.setColor(Color.RED);
                if(filled)
                    g.fillOval(randomWidth, randomHeight, 30, 30);
                else
                    g.drawOval(randomWidth, randomHeight, 30, 30);
                break;
            
        }
    }
    
}

和测试程序:当我运行这个时,只会出现红色圆圈。

    package oppgave4;
    import javax.swing.*;
    import java.awt.*;

    public class TestProgram extends JFrame {
        public TestProgram(){
        add(new Circle(Circle.OVAL));
        add(new Circle(Circle.ANOTHEROVAL));
   
        }

    public static void main(String[] args) {
        TestProgram sirkel = new TestProgram();
        sirkel.setSize(400, 300);
        sirkel.setLocationRelativeTo(null);
        sirkel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        sirkel.setVisible(true);
    }
}
4

2 回答 2

1

首先,通过使每个Circlea JPanel,你会得到意想不到的结果,因为两个JPanels不能画到同一个地方。相反,它们被放置在我的 LayoutManager 中。在这种情况下,我会想象您的一个面板位于另一个面板之上,因此您只看到一个。

如果您希望圆圈位于同一个“面板”中(它们可以重叠),那么您将需要一个JPanel可以绘制多个圆圈的圆圈。

如果您希望它们在单独的面板中“并排”,我会看GridLayout

于 2013-11-09T15:27:09.597 回答
1

尝试使用除默认 BorderLayout 之外的布局管理器添加它们,看看会发生什么

import java.awt.*;    

public TestProgram(){
    setLayout(new GridLayout(1, 2);
    add(new Circle(Circle.OVAL));
    add(new Circle(Circle.ANOTHEROVAL));
}

另一种解决方案是使用默认BorderLayoutJFrame. 当您只是.add(something)时,它将自动添加到BorderLayout.CENTER,除非您指定位置。一个 BorderLayout 并且每个位置只包含一个组件。因此,当您尝试添加第二个时,只有第二个会出现在该CENTER位置。

如果你做了

public TestProgram(){
    setLayout(new GridLayout(1, 2);
    add(new Circle(Circle.OVAL), BorderLayout.CENTER);
    add(new Circle(Circle.ANOTHEROVAL), BorderLayout.SOUTH);
}

它也可以

于 2013-11-09T15:27:47.367 回答