Hallo,
Ich habe zwei Panels:
1. StartPanel (zum Starten des Spiels)
2. GamePanel (Worauf man das Spiel spielt)
Erstmal die Codes:
GamePanel:
StartPanel:
Ich möchte beim drücken des Buttons auf dem StartPanel, jenes entfernen und stattdessen das GamePanel auf den frame legen. Jedoch wird das Panel nicht repainted (obwohl in der while-Schleife ja ausdrücklich ein repaint() enthalten ist), was dazu führt dass die FPS-Rate immer wieder überdeckt wird.
Woran liegt das? Ich verstehe nicht ganz wieso das Panel nicht repainted wird. Und wie kann man das Problem lösen?
Mit freundlichen Grüßen,
Zitrus
Ich habe zwei Panels:
1. StartPanel (zum Starten des Spiels)
2. GamePanel (Worauf man das Spiel spielt)
Erstmal die Codes:
GamePanel:
Java:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Color;
import java.net.URL;
public class Panel extends JPanel implements Runnable
{
URL uLuigiLaeuft;
URL uLuigiSteht;
URL uLuigiSpringt;
URL uLuigiFaellt;
BufferedImage luigiLaueft;
BufferedImage luigiSteht;
BufferedImage luigiSpringt;
BufferedImage luigiFaellt;
long delta;
long last;
long fps;
public Panel()
{
setLayout(null);
setSize(800,500);
Thread th = new Thread(this);
th.start();
doInitializations();
}
@Override
public void paintComponent(Graphics g) {
g.setColor(Color.RED);
g.drawString("FPS: " + Long.toString(fps) ,20,20);
}
@Override
public void run() {
while(StartPanel.frame.isVisible()) {
calculateFPS();
this.repaint();
try{
Thread.sleep(10);
}
catch(InterruptedException e) {
}
}
}
void calculateFPS() {
delta = System.nanoTime() - last;
last = System.nanoTime();
fps = ((long) 1e9/delta);
}
void doInitializations() {
last = System.nanoTime();
}
void loadImages() {
}
}
StartPanel:
Java:
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import java.net.URL;
public class StartPanel extends JPanel implements ActionListener
{ static JFrame frame;
JButton start;
JLabel luigi;
Panel p;
URL uLuigiAnimated;
ImageIcon luigiAnimated;
public StartPanel(){
loadImages();
luigi = new JLabel(luigiAnimated);
luigi.setBounds(70,50,320,240);
start = new JButton("Start Game!");
start.setBounds(150,350,150,50);
start.addActionListener(this);
setLayout(null);
setSize(500,550);
frame = new JFrame();
frame.setTitle("New Super Luigi Brothers!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(100,100);
frame.setSize(500,550);
add(luigi);
add(start);
frame.add(this);
frame.setVisible(true);
}
void loadImages() {
uLuigiAnimated = getClass().getResource("LuigiAnimated.gif");
luigiAnimated = new ImageIcon(uLuigiAnimated);
}
@Override
public void actionPerformed(ActionEvent e) {
frame.remove(this);
p = new Panel();
frame.setSize(p.getWidth(),p.getHeight());
frame.add(p);
}
}
Ich möchte beim drücken des Buttons auf dem StartPanel, jenes entfernen und stattdessen das GamePanel auf den frame legen. Jedoch wird das Panel nicht repainted (obwohl in der while-Schleife ja ausdrücklich ein repaint() enthalten ist), was dazu führt dass die FPS-Rate immer wieder überdeckt wird.
Woran liegt das? Ich verstehe nicht ganz wieso das Panel nicht repainted wird. Und wie kann man das Problem lösen?
Mit freundlichen Grüßen,
Zitrus