Hallo,
also ich weis nicht so genau wie ich euch den Fehler beschreiben soll.
Ich beschreibe erst ein mal wie der Aufbau des Prgramms ist.
Auf dem JFrame (Klasse A) liegt mit add() eine Klasse X die von JPanel erbt , diese Klasse besitzt ein JLabel hat auf
dem das Hintergrundbild liegt. Zu der Klasse X kommt eine Klasse Y hinzu die ebenfalls mit mit add() der Klasse X
hinzu gefügt wird. Die Klasse Y ist ein JPanel auf dem sich 2 Buttons befinden.
Die Klasse A implementiert den KeyListener, wenn eine Taste gedrückt wird, wird aus der Klasse Y ein Methode
Aufgerufen die die Buttons hoch bzw. runter bewegt. Die Klasse funktioniert in dem mit .setLocation(x,y) die position
um einen Pixel pro 5ms verschoben wird.
Und dann beginnt der Fehler...
Beim Start des Programms sieht alles normal aus, jedoch wenn die Buttons bewegt werden, sieht man dann das
JPanel der Klasse Y. Ich habe auch schon versucht mit setOpaque( false ) das JPanel zu "verstecken", jedoch
verschwinden dann die Buttons bei der ersten Bewegung.
Da ich nicht weis wo der Fehler liegen könnte (wahrscheinlich vor dem PC) post ich auch grad mal
die Klassen
Klasse Y
Klasse X
und noch die Klasse A
oje... also ich hoff mal ihrgend Jemand hat in etwa verstanden was ich will^^
Sitze schon seit heute morgen um 9 da und versuche den Fehler zu beseitigen, bin mit den Nerfen ein wenig am Ende.
Und verdammt schül isses auch noch.
also ich weis nicht so genau wie ich euch den Fehler beschreiben soll.
Ich beschreibe erst ein mal wie der Aufbau des Prgramms ist.
Auf dem JFrame (Klasse A) liegt mit add() eine Klasse X die von JPanel erbt , diese Klasse besitzt ein JLabel hat auf
dem das Hintergrundbild liegt. Zu der Klasse X kommt eine Klasse Y hinzu die ebenfalls mit mit add() der Klasse X
hinzu gefügt wird. Die Klasse Y ist ein JPanel auf dem sich 2 Buttons befinden.
Die Klasse A implementiert den KeyListener, wenn eine Taste gedrückt wird, wird aus der Klasse Y ein Methode
Aufgerufen die die Buttons hoch bzw. runter bewegt. Die Klasse funktioniert in dem mit .setLocation(x,y) die position
um einen Pixel pro 5ms verschoben wird.
Und dann beginnt der Fehler...
Beim Start des Programms sieht alles normal aus, jedoch wenn die Buttons bewegt werden, sieht man dann das
JPanel der Klasse Y. Ich habe auch schon versucht mit setOpaque( false ) das JPanel zu "verstecken", jedoch
verschwinden dann die Buttons bei der ersten Bewegung.
Da ich nicht weis wo der Fehler liegen könnte (wahrscheinlich vor dem PC) post ich auch grad mal
die Klassen
Klasse Y
Code:
import java.awt.Dimension;
import javax.swing.JPanel;
public class EinfachesMenue extends JPanel
{
private boolean isRunning = false;
private GButton buttons[];
private int zwischenraum = 0;
private int vorschub = 40;
public int aktiverButton;
public int letzterButton;
public EinfachesMenue( Dimension d, String buttonTexte[] )
{
super();
this.setLayout( null );
this.setSize( 300, 200 );
this.setLocation( ( d.width - this.getSize().width ) / 2, ( d.height - this.getSize().height ) / 2 );
this.setDoubleBuffered( true );
this.setVisible( true );
this.erstelleButtons( buttonTexte );
this.setOpaque( true );
this.repaint();
}
public void erstelleButtons( String buttonTexte[] )
{
buttons = new GButton[buttonTexte.length];
for( int i = 0; i < buttonTexte.length; i++)
{
buttons[i] = new GButton( buttonTexte[i], i );
buttons[i].setOpaque( true );
buttons[i].setLocation( (this.getSize().width - buttons[i].getSize().width) / 2, 0 );
this.zwischenraum = (( this.getSize().height - ((buttons.length+1)*buttons[0].getSize().height) ) / buttons.length );
int pos = (zwischenraum + buttons[i].getSize().height) * (i+1);
if( i == 0 )
buttons[i].setLocation( buttons[i].getLocation().x + this.vorschub, pos );
else
buttons[i].setLocation( buttons[i].getLocation().x, pos );
this.add( buttons[i] );
}
this.aktiverButton = 0;
this.letzterButton = ( buttons.length - 1 );
}
synchronized boolean getIsRunning()
{
return this.isRunning;
}
synchronized void setIsRunning( boolean b )
{
this.isRunning = b;
}
synchronized void moveUp()
{
if( this.aktiverButton <= 0 )
return;
int bewegungsLaenge = this.zwischenraum + this.buttons[0].getSize().height;
for( int i = 0; i < bewegungsLaenge; i++ )
{
try{ Thread.sleep( 5 ); } catch( Exception e ) {}
for( int x = 0; x <= (buttons.length-1); x++ )
{
buttons[x].setLocation( buttons[x].getX(), buttons[x].getY() + 1 );
buttons[x].repaint();
}
if( i > ( bewegungsLaenge - this.vorschub ) )
{
buttons[this.aktiverButton].setLocation( buttons[this.aktiverButton].getX() - 1, buttons[this.aktiverButton].getY() );
buttons[this.aktiverButton-1].setLocation( buttons[this.aktiverButton-1].getX() + 1, buttons[this.aktiverButton-1].getY() );
}
this.repaint();
}
this.aktiverButton--;
}
synchronized void moveDown()
{
if( this.aktiverButton >= this.letzterButton )
return;
int bewegungsLaenge = this.zwischenraum + this.buttons[0].getSize().height;
for( int i = 0; i < bewegungsLaenge; i++ )
{
try{ Thread.sleep( 5 ); } catch( Exception e ) {}
for( int x = 0; x <= (buttons.length-1); x++ )
{
buttons[x].setLocation( buttons[x].getX(), buttons[x].getY() - 1 );
}
if( i > ( bewegungsLaenge - this.vorschub ) )
{
buttons[this.aktiverButton].setLocation( buttons[this.aktiverButton].getX() - 1, buttons[this.aktiverButton].getY() );
buttons[this.aktiverButton+1].setLocation( buttons[this.aktiverButton+1].getX() + 1, buttons[this.aktiverButton+1].getY() );
}
this.repaint();
}
this.aktiverButton++;
}
}
Klasse X
Code:
import java.awt.Dimension;
import java.awt.Image;
import java.io.File;
import javax.swing.*;
public class Fenster extends JPanel
{
private String fensterID;
private ImageIcon hintergrundBild;
private JLabel hintergrundLabel;
private String fileSource;
private Boolean changeBild = false;
public Fenster( Dimension d )
{
super();
// Das Layout null setzen für eine freie Platzierung der Fensterelemente
this.setLayout( null );
// Die Größe des JPanels der Größe des Fensters anpassen
this.setSize( d );
// Das JPanel durchsichtig machen
this.setOpaque( false );
// Doppelt gebuffert für eine bessere Darstellung bei zB. der Bewegung des Menüs
this.setDoubleBuffered( true );
// Das Hintergrundbild dem JPanel zuweisen
hintergrundLabel = new JLabel();
hintergrundLabel.setSize( d );
hintergrundLabel.setLocation( 0, 0 );
hintergrundLabel.setDoubleBuffered( true );
hintergrundLabel.setVisible( true );
// Hintergrundbild entsprechend der Fenstergröße auswählen
if( d == IIMosPlayerBox.DIMENSION_SMALL )
fileSource = "src/BG_848x480.jpg";
if( d == IIMosPlayerBox.DIMENSION_BIG )
fileSource = "src/BG_1280x768.jpg";
if( d == IIMosPlayerBox.DIMENSION_FULL )
{
if( d.height > IIMosPlayerBox.DIMENSION_BIG.height && d.width > IIMosPlayerBox.DIMENSION_BIG.width )
fileSource = "src/BG_1280x768.jpg";
else
fileSource = "src/BG_848x480.jpg";
this.changeBild = true;
}
// Bilddatei auf vorhandenheit püfen und bei Erfolg
// Bild laden und dem Label hinzufügen
File bildQuelle = new File( fileSource );
if( bildQuelle.exists() )
{
hintergrundBild = new ImageIcon( fileSource );
// Wenn die Bildschirmgröße nicht einem der 2 Standartgrößen
// entspricht wird das Bild der Größe angepasst
if( this.changeBild )
{
hintergrundBild.setImage( hintergrundBild.getImage().getScaledInstance( d.width, d.height, Image.SCALE_SMOOTH ) );
this.changeBild = false;
}
hintergrundLabel.setIcon( hintergrundBild );
this.add( hintergrundLabel );
}
else
Logger.getInstance().log( "Datei "+ fileSource +" konnte nicht gefunden werden", 1);
this.setVisible( true );
}
public String getFensterID()
{
return this.fensterID;
}
public void setFensterID( String fid )
{
this.fensterID = fid;
}
}
und noch die Klasse A
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class FensterKontrolle extends JFrame implements KeyListener
{
private String aktivesFenster; // Fenster ID des aktuell angezeigten Fensters. Ermöglicht die Navigation zwischen den Fenstern
private Dimension dimension;
private F_Hauptmenue hauptmenue;
/* Konstruktor */
public FensterKontrolle( Dimension d )
{
// Konstruktor-Aufruf des JFrame
super(IIMosPlayerBox.BOX_NAME + ", Box ID: " + IIMosPlayerBox.BOXINFOS.BOX_ID);
this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
// Die Größe des Fensters wird fest gesetzt
this.setSize( d );
// Menüleiste und die Rahmen werden entfernt wenn diese vorhanden sind
if( this.isUndecorated() == false )
this.setUndecorated( true );
// Das Fenster wird in der Mitte des Bildschirms platziert
Dimension bildschirmSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation( ( bildschirmSize.width - this.getSize().width ) / 2,
( bildschirmSize.height - this.getSize().height ) / 2 );
// Das Fenster wird fokusierbar gemacht und wird automatisch fokusiert.
// Dies ist notwendig für den KeyListener, ohne Fokus auf dieses
// Fenster ist der KeyListener der Fensterkontrolle inaktiv
this.setFocusable( true );
// Der KeyListener wird dem Fenster hinzugefügt und aktiviert
this.addKeyListener( this );
// Das Fenster sichtbar machen
this.setVisible( true );
this.dimension = d;
// System.out.println( getClass() );
hauptmenue = new F_Hauptmenue( d );
hauptmenue.repaint();
this.add( hauptmenue );
this.aktivesFenster = hauptmenue.getFensterID();
this.repaint();
}
public void keyPressed(KeyEvent ev)
{
if( this.aktivesFenster.equals("H001") )
{
if( hauptmenue.menue.getIsRunning() == false )
{
// Tastendruck U
if( ev.getKeyCode() == KeyEvent.VK_U )
{
Thread myThread = new Thread()
{
public void run()
{
hauptmenue.menue.setIsRunning( true );
hauptmenue.menue.moveUp();
hauptmenue.menue.setIsRunning( false );
}
};
myThread.setPriority( Thread.MAX_PRIORITY );
myThread.start();
}
// Tastendruck D
if( ev.getKeyCode() == KeyEvent.VK_D )
{
Thread myThread = new Thread()
{
public void run()
{
hauptmenue.menue.setIsRunning( true );
hauptmenue.menue.moveDown();
hauptmenue.menue.setIsRunning( false );
}
};
myThread.setPriority( Thread.MAX_PRIORITY );
myThread.start();
}
}
}// ENDE H001
}
// Methoden werden nicht ind diesem Prohramm genutzt.
// Der KeyListener erwartet jedoch die implementierung
// der Methoden
public void keyTyped(KeyEvent arg0) { }
public void keyReleased(KeyEvent arg0) { }
}
oje... also ich hoff mal ihrgend Jemand hat in etwa verstanden was ich will^^
Sitze schon seit heute morgen um 9 da und versuche den Fehler zu beseitigen, bin mit den Nerfen ein wenig am Ende.
Und verdammt schül isses auch noch.