如何将值传递给paintComponent

时间:2018-12-19 18:38:20

标签: java swing graphics

我有一个100个随机整数的数组。我想从他们创建一个条形图。我知道如何在框架中创建单个矩形,但不传递值。

这是绘画类:

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

public class draw extends JPanel
{
    public void drawing() {

        repaint();
    }

public void paintComponent(Graphics g) {

        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(100, 150, 12, 3);
    }
}

我想用随机的int值替换g.fillRect(100,150,12,3)中的值。但由于我从main调用repaint()来调用paintComponent,因此无法将值传递给paintComponent。我该怎么做?如果不可能,我有什么选择?

3 个答案:

答案 0 :(得分:0)

您可以通过引入字段并初始化然后使用构造函数,setter或这两者来实现:

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

public class Draw extends JPanel {

    int x, y, width, height;
    public Draw(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

    void setX(int x) {this.x = x;}

    void setY(int y) {this.y = y;}

    void setWidth(int width) {this.width = width;}

    void setHeight(int height) {this.height = height;}

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(x, y, width, height);
    }
}

答案 1 :(得分:0)

  

如何将值传递给paintComponent

您不能将值传递给paintComponent()

  

但是由于我从main调用repaint()来调用paintComponent,所以无法将值传递给paintComponent。我该怎么办?

对于您要自定义和绘制的任何对象,都可以为其创建一个类,并使用类似draw()的方法进行绘画,例如:

//Just a normal class with a draw() method
class BarGraph{
    private int x;
    private int y;
    private int width;
    private int height;
    private Color color;

    public BarGraph(int x, int y, int width, int height){
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

    public void setColor(Color color){
        this.color = color;
    }

    public void draw(Graphics g){
        g.setColor(color);
        g.fillRect(x, y, width, height);
    }
}

然后在主面板中显示自定义图像:

class DrawingSpace extends JPanel{
    private BarGraph barGraph;

    public DrawingSpace(){
        barGraph = new BarGraph(50, 50, 400, 100);
        barGraph.setColor = (Color.RED);
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g){
            barGraph.draw(g);        //draw your own customized object
        }
    }
}

因此,您可以尝试在自己的类(本例中为BarGraph类)中传递/设置值,而不是尝试通过传递值来指示paintComponent的绘制方式。从“图形”内容中,实现您希望如何绘制它。

在您的paintComponent中,只需调用draw方法,该方法已经具有有关如何绘制的“一组指令”。

答案 2 :(得分:0)

我们无法将值作为参数传递给paintComponent方法,因为我们只是覆盖了Swing调用的现有方法。但是我们可以在该类中有一个实例变量(在我的示例中为values),可以在paintComponent方法内部进行访问(如其他答案/评论所建议)。

我在下面放置一个示例程序,因为有时示例可以更好地传达想法。

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;

public class BarGraph extends JPanel
{
  private static final int GRAPH_HEIGHT = 300;
  private static final int BAR_WIDTH = 50;
  private static final int GAP_BETWEEN_BARS = 20;
  private static final int GRAPH_X_OFFSET = 50;

  private int[] values;

  public BarGraph(int[] values)
  {
    this.values = values;
  }

  @Override
  protected void paintComponent(Graphics g)
  {
    super.paintComponent(g);
    g.setColor(Color.BLUE);
    for (int i = 0; i < values.length; i++)
    {
      g.fillRect(
          GRAPH_X_OFFSET + (i * (GAP_BETWEEN_BARS + BAR_WIDTH)),
          GRAPH_HEIGHT - values[i],
          BAR_WIDTH,
          values[i]
      );
    }
  }

  public static void main(String[] args)
  {
    int[] graphValues = {100, 150, 50, 250, 200, 75};

    JFrame frame = new JFrame("Graph");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new BarGraph(graphValues), BorderLayout.CENTER);
    frame.setBounds(300, 200, 600, 400);
    frame.setVisible(true);
  }
}