объект, куда я добавляю элементы.
хо знаю Swing, так что извините за глупый вопрос. Что мне нужно сделать, это сделать мои собственные компоненты (они являются предкамиJPanel
) с покраской, выполненной из буфера (BufferedImage
экземпляр). Это является обязательным требованием, поскольку процедура рисования может быть очень тяжелой, поэтому метод paintComponent переопределяется для рисования из этого буфера и немедленного возврата (но если вы знаете более эффективные способы сказать Java, что не следует перерисовывать объект более 200-300 раз в секунду, потребляя весь процессор - я был бы признателен, может быть, есть некоторые публичные методы, чтобы пометить области контекста Graphics как «не измененные», поэтому Swing не пытается их перерисовать).
Что не так с моим кодом, что он просто не рисует данные о перекрывающихся JPanels. Я сделал воспроизводимый пример суть проблемы. Смотрите код ниже:
public class Dr extends JPanel {
public Dr(int x, int y, int w, int h, int fw, int fh) {
left = x;
top = y;
width = w;
height = h;
full_width = fw;
full_height = fh;
setOpaque(true);
}
public void draw() {
if (buffer == null && width > 0 && height > 0) {
buffer = new BufferedImage(width, height, java.awt.image.BufferedImage.TYPE_INT_ARGB);
}
if (buffer == null) return;
Graphics g = buffer.getGraphics();
setBounds(0, 0, full_width, full_height);
Graphics2D g2d = (Graphics2D)g;
g2d.setBackground(Color.WHITE);
g2d.clearRect(0, 0, full_width, full_height);
g2d.setColor(new Color(255, 0, 80, 128));
g2d.fillRect(left, top, width, height);
System.out.println(left + ", " + top);
}
@Override
public void repaint() {
draw();
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(buffer, 0, 0, null);
}
private BufferedImage buffer;
private int left;
private int top;
private int width;
private int height;
private int full_width;
private int full_height;
}
Это пример класса, который делает только сохранение своих координат для рисования и полных измерений (которые я хочу, чтобы они были равны его родительским измерениям, это опять требование, потому что мне нужно поддерживать видимый переполненный контент, чтобы его можно было отображать) и рисуя красный прямоугольник с половиной 100% непрозрачности.
Вот внешний код, который его использует:
Dr dr1 = new Dr(4, 4, width-10, 80, width-2, height-2);
Dr dr2 = new Dr(4, 88, width-10, 80, width-2, height-2);
root.add(dr1);
root.add(dr2);
dr1.setBounds(0, 0, width-2, height-2);
dr2.setBounds(0, 0, width-2, height-2);
dr1.draw();
dr2.draw();
Что ожидается быть:
Что отображается, когда я удаляю свой буфер и рисуюpaintComponent
метод напрямую:
Что отображается, когда я не заполняю фон (здесь фон имеет системный цвет L & F, но мне нужен цвет родительского элемента (в моем примере это белый)
Что отображается, когда я рисую из буфера
Последнее совершенно забавно. Красный прямоугольник частично обрезается справа и снизу, а полное изображение (включая белый фон) обрезается по координате (0, 0) родительской панели. Второй объект вообще не отображается. Координаты в консоли абсолютно нормальные.
Я чувствую, что есть что-то, что я должен сделать с Swing, чтобы сказать ему не выполнять свою «магию» при угадывании, что рисовать, а что не рисовать. Но как я могу это сделать?
ОБНОВИТЬ:
Я обнаружил, что даже если я не позвонюdraw()
Метод моих дочерних компонентов, после того как я их добавил, они все еще скрывают фон своего родителя (что не должно происходить, поскольку JPanels для базы должны быть непрозрачными). Так что основная проблема в том, что я не могу сделатьDr
объекты имеют непрозрачный фон (например, без фона), где в них ничего не нарисовано (это также объясняет, почему я вижу только первый прямоугольник - z-порядок в Swing кажется перевернутым, например, последний добавленный компонент закрашивается снизу, как это был самый дальний от нас).