, но когда дело доходит до рисования гистограммы, я не могу определить 4 аргумента, необходимых для fillRect.
JavaDocs довольно явно указаны в свойствах иих значения, это просто поле, с позицией (x / y) и размером (ширина / высота)
public abstract void fillRect (int x, int y, int width, int height)
Заполняет указанный прямоугольник.Левый и правый края прямоугольника имеют размеры x и x + width - 1. Верхний и нижний края имеют значения y и y + height - 1. Получившийся прямоугольник охватывает область шириной в пиксели шириной и высотой пикселя в высоту.Прямоугольник заполняется с использованием текущего цвета графического контекста.
Параметры:
x - координата x прямоугольника, который нужно заполнить.
y - координата y прямоугольника, который нужно заполнить.
width - ширина прямоугольника, который будетзаполнено.
высота - высота прямоугольника, который будет заполнен.
Я играл с различными переменными, но, кажется, ничто не может приблизить меня.
Итакна ум приходят две вещи, первая из приведенных выше JavaDocs ...
Прямоугольник заполняется с использованием текущего цвета графического контекста
Это легкозабыть
Во-вторых, кажется, вы неправильно поняли, как рисование работает в Swing.
Живопись в Swing имеет очень специфический и хорошо документированный рабочий процесс.Первое, что вы должны сделать, это прочитать Выполнение пользовательской живописи и Рисование в AWT и Swing , чтобы лучше понять, как работает живопись и как с ней работать.
Нет веских причин для вызова JComponent#getGraphics
, кроме возможности возврата null
, это всего лишь снимок последнего цикла рисования и будет очищен при следующем проходе (который может произойти прив любое время по любому количеству причин).
Вместо этого вам потребуется пользовательский компонент и вместо него переопределить его метод paintComponent
.
После этого вы должны прочитать 2DГрафика позволяет лучше понять, как работает API и какие функции / функциональные возможности он может предоставить.
Например ....
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.Arrays;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Random rnd = new Random();
int[] binCounts = new int[10];
for (int index = 0; index < binCounts.length; index++) {
binCounts[index] = rnd.nextInt(100);
}
JFrame frame = new JFrame();
frame.add(new DrawingPanel(binCounts));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class DrawingPanel extends JPanel {
private int[] binCounts;
private int max;
public DrawingPanel(int[] binCounts) {
this.binCounts = binCounts;
max = Arrays.stream(binCounts).max().getAsInt();
System.out.println(max);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 800);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
int barWidth = 800 / binCounts.length;
for (int i = 0; i < binCounts.length; i++) {
int barHeight = (int)((binCounts[i] / (double)max) * getHeight());
// I personally would cache this until the state of the component
// changes, but for brevity
Rectangle rect = new Rectangle(i * barWidth, getHeight() - barHeight, barWidth, barHeight);
g2d.setColor(Color.BLUE);
g2d.fill(rect);
g2d.setColor(Color.BLACK);
g2d.draw(rect);
}
g2d.dispose();
}
}
}