JFrame在一个类中定义,JComponent在另一个类

时间:2017-09-20 20:31:59

标签: java class jcomponent

相对较新的Java,为学校项目编写代码。

我使用JFrame和JComponent,绘制模式和字符串以及所有有趣的东西。

目前,我编写了一个扩展JComponent的类。这是我定义大部分形状的类。问题是我初始化了我的Jframe (代码:JFrame myFrame = new JFrame())在一个类的主要部分,但是我需要在我工作的JComponent类中访问myFrame.getWidth()。

如何在&#34中访问变量getWidth()和getHeight();公共类MyJComponent扩展JComponent" ,当我在公共类Lab2'中定义myFrame时??

编辑代码:

public class Lab2 {
    public static void main(String[] args) {
    System.out.println("Hello Java");

    JFrame myFrame = new JFrame();

    myFrame.setSize(500, 500);
    myFrame.setTitle("Color Test");
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MyJComponent myComponent = new MyJComponent(500, 500);
    myFrame.add(myComponent);
    myFrame.getContentPane().setBackground(Color.white); //sets background color.

    myFrame.setVisible(true);   // setVisible() *after* add() is the norm



    //Deciding geometry of hidden shape. paintComponent is called once per run, this is called afterwards.

}

}

/ ** /

public class MyJComponent extends JComponent {

int[] circleX;
int[] circleY;
int[] circleR;
final int MIN_RADIUS = 5;
final int MAX_RADIUS = 15;
final int MIN_SEPARATION = 1;
final int MAX_ATTEMPTS = 5000;
final int MAX_CIRCLES = 1000;
Random rand;
int initialWidth;
int initialHeight;
int numCircles;   // actual number of circles drawn



// are circles at index i and index j separated by *<= tolerance* pixels?

boolean twoCirclesOverlap(int i, int j, int tolerance) {
    double distanceBetweenCenters =
            Math.sqrt((circleX[i] - circleX[j]) * (circleX[i] - circleX[j]) +
                    (circleY[i] - circleY[j]) * (circleY[i] - circleY[j]));
    return (distanceBetweenCenters <= (circleR[i] + circleR[j] + tolerance));
}

// are any existing circles separated from the proposed one at index i by *<= tolerance* pixels?

boolean anyCirclesOverlap(int i, int tolerance) {
    for (int j = 0; j < i; j++) {
        if (twoCirclesOverlap(i, j, tolerance)) {
            return true;
        }
    }
    return false;
}

// attempt to randomly place the largest-possible circle that does not overlap any existing one

boolean tryToPlaceCircle(int i) {

    for (int j = 0; j < MAX_ATTEMPTS; j++) {

        // pick a random position, set initial radius to minimum

        circleX[i] = rand.nextInt(initialWidth);
        circleY[i] = rand.nextInt(initialHeight);
        circleR[i] = MIN_RADIUS;

        // grow circle until it touches another or reaches max size

        while (!anyCirclesOverlap(i, MIN_SEPARATION) && circleR[i] < MAX_RADIUS)
            circleR[i]++;

        // it was touching from the start -- must try again

        if (circleR[i] == MIN_RADIUS) {
            continue;
        }

        // grew to max size -- well done

        else if (circleR[i] == MAX_RADIUS) {
            return true;
        }

        // grew some, but then touched

        else {
            circleR[i]--;   // retract to the step before touch
            return true;
        }
    }

    // all attempts failed

    return false;
}

MyJComponent(int width, int height) {

    circleX = new int[MAX_CIRCLES];
    circleY = new int[MAX_CIRCLES];
    circleR = new int[MAX_CIRCLES];

    initialWidth = width;
    initialHeight = height;

    rand = new Random();

    numCircles = 0;
    while (numCircles < MAX_CIRCLES && tryToPlaceCircle(numCircles)) {
        numCircles++;
    }
}

//Override paintComponent
public void paintComponent(Graphics g) {

    for (int i = 0; i < numCircles; i++) {
        g.drawOval(circleX[i] - circleR[i], circleY[i] - circleR[i], 2 * circleR[i], 2 * circleR[i]);
    }
}

//Shape decision
public void shapeDecision() {
    double randomShapeDecider = Math.random();
    if (randomShapeDecider > .50) {
        //shape is circle, define it's properties
        hiddenCircleDiameter = myFrame.getWidth();

    }
    else {
        //shape is rectangle
        hiddenRectangleWidth = myFrame.getWidth();
    }
}
}

0 个答案:

没有答案