Как я могу передать значения в paintComponent - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть массив из 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);
    }
}

Я хочу заменить значения в g.fillRect (100,150,12,3) с моими случайными значениями int.Но так как я вызываю repaint () из main для вызова paintComponent, я не могу передать значения в paintComponent.Как мне это сделать?если это невозможно, какие у меня есть альтернативы?

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Как передать значения в paintComponent

Нельзя передать значения в paintComponent().

Но так как я вызываю 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
        }
    }
}

Таким образом, вместо того, чтобы пытаться передать значения, чтобы диктовать, как рисовать paintComponent, вы можете передать / установить свои значения вваш собственный класс (в данном случае, класс BarGraph).Из графического содержимого реализуйте, как вы хотите, чтобы оно рисовалось.

В вашем paintComponent просто вызовите метод draw, у которого уже есть «набор инструкций» для его рисования.

0 голосов
/ 23 декабря 2018

Мы не можем передать значения методу 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);
  }
}
0 голосов
/ 21 декабря 2018

Вы можете сделать это, введя поля и инициализировав их, затем используя конструкторы, сеттеры или оба:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...