В настоящее время я использую класс Applet для создания простой игры. Поскольку есть эффект мерцания, я добавил двойную буферизацию для Graphics
компонентов, создав внеэкранный буфер следующим образом:
public class AppletTest extends Applet implements Runnable {
Thread thread;
Image img;
Graphics gfx;
public final int WIDTH = 700, HEIGHT = 500;
public void init() {
this.resize(WIDTH, HEIGHT);
thread = new Thread(this);
thread.start();
img = createImage(WIDTH, HEIGHT); // off-screen buffering
gfx = img.getGraphics();
}
public void draw(Graphics g) {
gfx.setColor(Color.BLACK);
gfx.fillRect(0, 0, WIDTH, HEIGHT);
gfx.setColor(Color.WHITE);
gfx.fillRect(50, 50, 100, 100);
gfx.setFont(new Font("Century", Font.BOLD, 30));
gfx.drawString("I feel good sometimes I don't", 200, 200);
g.drawImage(img, 0, 0, this); // draws the off-screen image
}
public void update(Graphics g) {
draw(g);
}
public void run() {
while(true) {
repaint();
try {
Thread.sleep(5);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
Если вы запустите приложение, все компоненты/методы Graphics
(.fillRect, .drawString и т. д.) отрисовываются в буфере за пределами экрана. Однако моя цель — добавить JButton в апплет, и, как и ожидалось, компонент JButton не загружается вне экрана (что означает мерцание).
Graphics gfx;
JButton button1;
public void draw(Graphics g) {
setLayout(null);
button1.setBounds(225, 400, 250, 50);
button1.setFont(new Font("Courier", Font.PLAIN, 17));
button1.setForeground(Color.WHITE);
button1.setBackground(Color.DARK_GRAY);
add(button1); // is it possible to draw the JButton on the off-screen buffer?
}
Как бы вы добавили загрузку за пределами экрана в компонент JButton?
super.update
и не передавая ей свой двойной буфер). Сказав это, апплеты мертвы — пора двигаться дальше. Лучшим решением было бы начать сJPanel
, который уже имеет двойную буферизацию. Затем вы можете добавить это в любой контейнер, который вы хотите. Кроме того, не пытайтесь рисовать компоненты Swing, это намного больше, чем просто они были нарисованы. - person MadProgrammer   schedule 17.05.2018