Этот ответ оставлен здесь для справки, но это не правильный ответ, потому что он отображается внутри потока EDT.
Вот рабочее исправление! : D В основном проблема в том, что ComponentResized не вызывается надлежащим образом, пока мышь не будет отпущена после сжатия. Кроме того, поскольку методы paint и checkSize синхронизированы, они могут исключать друг друга в редких случаях. Исправление заключается в переопределении метода validate в классе Frame. Этот метод всегда вызывается, если фрейм изменяет состояние, включая сжатие и рост. Таким образом, мы просто должны проверить размер в валидаторе и вообще можем полностью забыть об использовании метода ComponentResized.
Итак, вот рабочий код, который компилируется как есть. Я изменил некоторые имена переменных, чтобы улучшить мою читабельность.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.image.BufferStrategy;
import java.awt.Frame;
public class SmoothResize extends Frame {
public static void main(String[] args) {
Toolkit.getDefaultToolkit().setDynamicLayout(true);
System.setProperty("sun.awt.noerasebackground", "true");
SmoothResize srtest = new SmoothResize();
//srtest.setIgnoreRepaint(true);
srtest.setSize(100, 100);
srtest.setVisible(true);
}
public SmoothResize() {
render();
}
private Dimension old_size = new Dimension(0, 0);
private Dimension new_size = new Dimension(0, 0);
public void validate() {
super.validate();
new_size.width = getWidth();
new_size.height = getHeight();
if (old_size.equals(new_size)) {
return;
} else {
render();
}
}
public void paint(Graphics g) {
validate();
}
public void update(Graphics g) {
paint(g);
}
public void addNotify() {
super.addNotify();
createBufferStrategy(2);
}
protected synchronized void render() {
BufferStrategy strategy = getBufferStrategy();
if (strategy == null) {
return;
}
// Render single frame
do {
// The following loop ensures that the contents of the drawing buffer
// are consistent in case the underlying surface was recreated
do {
Graphics draw = strategy.getDrawGraphics();
Insets i = getInsets();
int w = (int)(((double)(getWidth() - i.left - i.right))/2+0.5);
int h = (int)(((double)(getHeight() - i.top - i.bottom))/2+0.5);
draw.setColor(Color.YELLOW);
draw.fillRect(i.left, i.top + h, w,h);
draw.fillRect(i.left + w, i.top, w,h);
draw.setColor(Color.BLACK);
draw.fillRect(i.left, i.top, w, h);
draw.fillRect(i.left + w, i.top + h, w,h);
draw.dispose();
// Repeat the rendering if the drawing buffer contents
// were restored
} while (strategy.contentsRestored());
// Display the buffer
strategy.show();
// Repeat the rendering if the drawing buffer was lost
} while (strategy.contentsLost());
}
}
Я надеюсь, что это работает для вас!
Также, в последнюю секунду редактирования, я изменил логическую троичную операцию для выбора вашей сокращения или расширения строки. Последнее сравнение было ненужным, потому что для рассматриваемого сравнения значения могут быть больше, меньше или равны друг другу. Нет другой возможности, которая бы не генерировала NullPointerException
.
Пораженный текст больше не актуален, так как я полностью удалил весь этот метод. В качестве комментариев я указываю другие изменения, которые я внес в исходное сообщение.