repaint()を記述してもpaintComponent()が呼び出されません…
swingを使って簡単なゲームを作っているのですが、描画処理がどうもうまくいかなくて困っています。。。
並列処理を使ってコンポーネントをひたすらrepaintし続ける処理を書いたつもりなんですが、いろいろいじったりして何度試してみても一向にpaintComponent()が呼び出されません。
原因が分かる方がいれば、ぜひご教授願いたいです…
PlayView.java(一部抜粋)
import java.awt.*;
import java.swing.*;
public class PlayView extends JPanel implements KeyListener, Runnable{
public JPanel panel = new JPanel(); //全部のコンポ―ネントを乗せるJPanel
public static JPanel[] lane = new JPanel[4];
public JLabel[] judge = new JLabel[4];
public JLabel combo = new JLabel();
public Dimension panelsize = null;
public PlayView() {
for (int i = 0; i < 4; i++) {
lane[i] = new JPanel();
judge[i] = new JLabel();
}
panel.setSize(800, 600);
panel.setLayout(null);
for (int i = 0; i < 4; i++) { //座標指定でコンポーネントを配置
lane[i].setBounds(200 * i, 0, 200, 500);
judge[i].setBounds(200 * i, 520, 200, 60);
lane[i].setBackground(new Color(211,211,211));
lane[i].setBorder(new EtchedBorder(EtchedBorder.RAISED));
judge[i].setBorder(new EtchedBorder(EtchedBorder.RAISED));
judge[i].setFont(new Font("Arial",Font.PLAIN,27));
judge[i].setForeground(new Color(220,20,60));
panel.add(lane[i]);
panel.add(judge[i]);
}
this.panelsize = lane[0].getSize();
panel.setBackground(new Color(135,206,235));
panel.addKeyListener(this);
}
@Override
public void run() {
while (this.isVisible()) {
panel.repaint(); //10msごとにpanelの再描画
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void paintComponent(Graphics g) {
//System.out.println("paintComponent");
//super.paintComponent(g);
g.setColor(new Color(255, 255, 255));//211,211,211
for (int i = 0; i < 4; i++) {
g.fillRect(200 * i, 0, (int) this.panelsize.getWidth(), (int) this.panelsize.getHeight());
}
//座標をランダムに変えて画像を描画
for(int i = 0; i < 4; i++){
g.drawImage((new ImageIcon("hoge.png")).getImage(), (int)Math.random() * (int) this.panelsize.getWidth(),
(int)Math.random() * (int) this.panelsize.getHeight(), lane[i]);
}
}
@Override
public void keyPressed(KeyEvent arg0) {
if (arg0.getKeyCode() == KeyEvent.VK_SPACE) { //spaceを押したらrun()呼び出し
Thread thread = new Thread(this);
thread.start(); //this.run()の中身実行?
}
}
MainFrame.java
import java.awt.*;
import java.swing.*;
public class MainFrame extends JFrame implements KeyListener {
PlayView pv = new PlayView();
public MainFrame() {
this.add(pv.panel);
pv.panel.setVisible(true);
this.setBounds(200, 100, 800, 600);
this.addKeyListener(pv);
}
public static void main(String[] args) {
MainFrame f = new MainFrame();
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);
}
}