Хорошо, я бы сделал 2 вещи по-разному: во-первых, я протестировал обе версии, и обе у меня не работали. Я полагаю, это может быть вызвано бесконечным циклом, который вы создаете в конструкторе, поскольку он никогда не выйдет из него.
Помимо того, что у вас, похоже, есть ошибка в вашем paintMethod (на самом деле это должен быть метод рисования и переопределение супер-метода в JPanel), вам потребуется внести изменения в обновления. Я бы посоветовал вам взглянуть на «Game-Loops», хотя он также может работать с отдельным потоком для каждого экземпляра, хотя я бы посоветовал против этого. Я исправил ваш код, чтобы вы могли взглянуть на него: Первая версия с отдельной веткой:
package stackoverflowtests;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Skeleton extends JPanel implements Runnable {
private BufferedImage img = null;
public Skeleton() {
setSize(1000, 500);
try {
img = ImageIO.read(new File("index.jpg"));
} catch (IOException e) {
System.out.println("Loading failed.");
}
}
public void paint(Graphics g) {
g.drawImage(img, 50, 50, null);
}
@Override
public void run() {
while (true) repaint();
}
}
а для основного что-то в этом роде:
package stackoverflowtests;
import javax.swing.JFrame;
public class Main extends JFrame {
public Main() {
setSize(1280, 720);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Skeleton skeli = new Skeleton();
skeli.setLocation(0, 0);
skeli.setSize(1000, 500);
add(skeli);
new Thread(skeli).start();
setVisible(true);
}
public static void main(String[] args) {
Main main = new Main();
}
}
Возможность 2 с игровым циклом:
package stackoverflowtests;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Skeleton extends JPanel {
private BufferedImage img = null;
public Skeleton() {
setSize(1000, 500);
try {
img = ImageIO.read(new File("index.jpg"));
} catch (IOException e) {
System.out.println("Loading failed.");
}
}
public void paint(Graphics g) {
g.drawImage(img, 50, 50, null);
}
}
и для основного:
package stackoverflowtests;
import javax.swing.JFrame;
public class Main extends JFrame {
public Main() {
setSize(1280, 720);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Skeleton skeli = new Skeleton();
skeli.setLocation(0, 0);
skeli.setSize(1000, 500);
add(skeli);
setVisible(true);
}
public static void main(String[] args) {
Main main = new Main();
// Gameloop
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
int frames = 0;
while (true) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while (delta >= 1) {
// updates++;
delta--;
}
System.out.println("repaint");
main.repaint();
frames++;
}
}
}
Второе, что вам нужно задать себе вопрос, - можете ли вы просто использовать объект BufferedImage вместо целой JPanel для каждой сущности;)