【问题标题】:Passing Argument from JPanel into JFrame将参数从 JPanel 传递到 JFrame
【发布时间】:2012-09-13 19:29:01
【问题描述】:

我遇到了一个问题,我不知道如何解决它。我现在正在阅读(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);
}   
}

顺便说一句,一个小技巧可能比完整的答案更有帮助:)

问候,,,

【问题讨论】:

  • 你的意思是“计数器”总是 0 吗?对不起,我不明白你的问题。 “无法正确传递给主要方法”是什么意思。但是计数器似乎没有在正确的位置创建。
  • ,考虑在类构造函数中创建计数,而不是在其绘制组件方法中。
  • 计数器变量计算已创建的随机形状(在我的示例中为行)的数量,然后我想在 JLabel 中查看这个数字。
  • :您的问题是仅在绘制组件时才调用绘制组件,而不是在构造组件时调用。在类构建时,您的计数变量为 0。
  • Counter 是你的油漆本地的,你应该像 Hovercraft (+1) 所说的那样在你的类构造函数中创建它。顺便说一句,访问局部变量绝不能作为“公共”引用,而是使用 getter 和 setter。也就是说,对于这个问题,气垫船给出了答案。

标签: java swing jpanel paintcomponent


【解决方案1】:

counter 值在每次重绘时递增。这意味着,每当您调整窗口大小或执行其他触发重绘的操作时,您的计数器都会增加并显示错误的值。

但是,JLabel 当前显示 0,因为第一次重绘发生在您读取 toString() 方法中的计数值之后。

我建议您构建要在 RandomShapes 构造函数调用的方法中绘制的对象。您构建了一个 Line2D.Float 对象列表,并在您的绘制方法中绘制线条。

【讨论】:

  • 要明确一点:即使counter 值增加,标签也不会自动更新。当counter 发生变化时,需要一种机制来更新标签中的文本
【解决方案2】:

感谢大家提供有用的答案,我解决了这个问题:

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);
    }
}

问候,,,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多