0

解決方法がわからないという問題がありました。私は今読んでいます(JAVAのプログラミング方法第9版)。私のアプリケーション (第 9 章、390 ページ) は、異なる色の異なる形状を乱数で作成する必要があり、レイアウト (JFrame) には、形状を持つ JPanel と、これらの異なる形状の数を持つ JLabel が含まれます。ランダムな色でランダムな形状を作成しましたが、形状の数が main メソッドに正しく渡されません。それは常に私に0を示します。

RandomShapes.java

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;

public class RandomShapes extends JPanel{

public int counter;
private Random random = new Random();

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);

    drawLines(g);
}

public void drawLines(Graphics g){
    for(int i = 0 ; i < random.nextInt(20) ; i++){
        g.setColor(generateColor());
        g.drawLine(random.nextInt(getWidth()), random.nextInt(getHeight()), random.nextInt(getWidth()), random.nextInt(getHeight()));
        counter++;
    }

}

private Color generateColor(){
    Color color = new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));

    return color;
}

@Override
public String toString(){
    return String.format("%d",counter);
}
}

RandomShapesTest.java

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class RandomShapesTest{
public static void main(String[] args){
    RandomShapes shapes = new RandomShapes();
    JFrame application = new JFrame();

    JLabel status = new JLabel(shapes.toString());


    application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    application.add(shapes);
    application.setSize(600,600);
    application.add(status, BorderLayout.NORTH);
    application.setVisible(true);
}   
}

ところで、完全な答えよりもちょっとしたトリックの方が役に立つかもしれません :)

よろしく、、、

4

2 に答える 2

1

値は、counter再描画するたびに増分されます。つまり、ウィンドウのサイズを変更したり、再描画をトリガーする何かを実行したりすると、カウンターが増加し、間違った値が表示されます。

ただし、メソッドJLabelでカウント値を読み取った後に最初の再描画が行われるため、現在は0が表示されますtoString()

RandomShapesコンストラクターによって呼び出されるメソッドで描画されるオブジェクトを作成することをお勧めします。オブジェクトのリストを作成Line2D.Floatし、paintメソッドで線をペイントします。

于 2012-09-13T19:47:12.557 に答える
0

役に立つ回答をありがとう、私はこの問題を次のように解決しました:

CreateShapes.java

import java.awt.Color;
import java.awt.Graphics;

public class CreateShapes {

    private Graphics g;
    private Color myColor;
    private int x1, x2, x3, x4;

    public CreateShapes(int x1, int x2, int x3, int x4, Color myColor){
        this.x1 = x1;
        this.x2 = x2;
        this.x3 = x3;
        this.x4 = x4;
        this.myColor = myColor;
    }

    public void draw(Graphics g){
        g.setColor(myColor);
        g.drawLine(x1, x2, x3, x4);
    }
}

DrawShapes.java

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JPanel;

public class DrawShapes extends JPanel{

    private Random randomNumber = new Random();
    private CreateShapes[] shapes;
    private int shapeCounter;

    public DrawShapes(){

        setBackground(Color.WHITE);

        shapes = new CreateShapes[1+randomNumber.nextInt(15)];

        for(int i = 0 ; i < shapes.length ; i++){
            int x1 = randomNumber.nextInt(600);
            int x2 = randomNumber.nextInt(600);
            int x3 = randomNumber.nextInt(600);
            int x4 = randomNumber.nextInt(600);

            Color color = new Color(randomNumber.nextInt(255), randomNumber.nextInt(255), randomNumber.nextInt(255), randomNumber.nextInt(255));

            shapes[i] = new CreateShapes(x1, x2, x3, x4, color);
        }

        shapeCounter = shapes.length;
    }

    public int getShapesNumber(){
        return shapeCounter;
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);

        for(CreateShapes shape : shapes){
            shape.draw(g);
        }
    }
}

RandomShapesTest.java

import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JFrame;

public class RandomShapesTest {
    public static void main(String[] args){

        DrawShapes drawShapes = new DrawShapes();
        JFrame application = new JFrame();

        String status = String.format("Lines : %d", drawShapes.getShapesNumber());

        JLabel statusBar = new JLabel(status);

        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        application.add(drawShapes);
        application.add(statusBar,BorderLayout.SOUTH);
        application.setSize(600,600);
        application.setVisible(true);
    }
}

よろしく、、、

于 2012-09-15T08:13:04.307 に答える