Я создаю приложение java, где я использую класс JComponent для рисования. У меня проблема с методом repaint(), не запускающим paintComponent(). Что может быть причиной этого?Repaint() не вызывает paintComponent() в классе JComponent
Код:
JComponent Класс:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.Timer;
public class Display extends JComponent implements ActionListener{
private final static int Width = 400;
private final static int Height = 600;
private long period;
private Timer timer;
private Background background;
private boolean isRunning = false;
public Display(long period) {
this.period = period;
setSize(Width, Height);
prepeareUi();
setOpaque(false);
}
public void addNotify() {
if(!isRunning) {
timer = new Timer((int)period, this);
timer.start();
isRunning = true;
}
}
public void stop() {
if(isRunning)
isRunning = false;
}
private void prepeareUi() {
background = new Background(Width, Height);
}
public void paintComponent(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, Width, Height);
background.draw(g);
}
@Override
public void actionPerformed(ActionEvent arg0) {
if(isRunning) {
background.update();
repaint();
return;
}
System.exit(0);
}
}
класса Рама:
import javax.swing.JFrame;
public class Frame extends JFrame {
private static final int DEFAULTFPS = 20;
public Frame(long period) {
prepearUI(period);
}
private void prepearUI(long period) {
Display d = new Display(period);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(d);
pack();
setResizable(false);
setVisible(true);
}
public static void main(String[]args) {
String fpsS = null;
if(args.length==1)
fpsS = args[0];
int fps = (fpsS != null) ? Integer.parseInt(fpsS) : DEFAULTFPS;
long period = (long) (1000.0/fps); //In Ms!
Frame f = new Frame(period);
}
}
Фоновый
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Background {
private int ParentWidth;
private int ParentHeight;
private int width;
private int height;
private BufferedImage image;
private float x = 0;
private float y = 0;
private final static float ANIMATIONSPEED = 1F;
private final static int ANIMATION_RIGHT = 0;
private final static int ANIMATION_LEFT = 1;
private int animationway = 1;
public Background(int W, int H) {
ParentWidth = W;
ParentHeight = H;
prepeareImage();
}
private void prepeareImage() {
width = 0; height = 0;
try {
image = ImageIO.read(getClass().getResource("UI\\background.png"));
width = image.getWidth(null);
height = image.getHeight(null);
} catch (IOException e) {
System.err.println("Background.png not found!");
}
}
public void update() {
if(animationway == ANIMATION_RIGHT) {
x += ANIMATIONSPEED;
if(x>=0F) {
animationway = ANIMATION_LEFT;
}
}
if(animationway == ANIMATION_LEFT) {
x -= ANIMATIONSPEED;
if(x<=width/-1+ParentWidth) {
animationway = ANIMATION_RIGHT;
}
}
}
public void draw(Graphics g) {
g.drawImage(image, (int) x, (int) y, null);
}
}
Использовать getPreferredSize по setSize; вызов super.paintComponent перед выполнением пользовательской покраски – MadProgrammer