Bild wird nicht angezeigt


K3rn

Mitglied
Hallo

Ich bin gerade dabei, mir das Thema Swing ein bisschen beizubringen, hänge aber gerade bei einem Problem mit einem JLabel.
Also das Problem ist, das JLabel wird während der Schleife nicht angezeigt, jedoch außerhalb schon. Hier der Code:
Code:
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
import java.util.Random;

class win extends JFrame{
	win(int x,int y,String titel){
		setSize(x,y);
		setTitle(titel);
	}
}

public class test{
	public static void main(String [] args) throws IOException{
		final JFrame f=new win(300,300,"Counter-Strike");
		
		ActionListener al=new ActionListener() { 
      		public void actionPerformed( ActionEvent e ) { 
      			f.setVisible(false);
      			Random r=new Random();
      			int pos1,pos2;
        		String s=((JTextField)e.getSource()).getText()+" DU !";
        		JFrame f2=new win(400,400,s);
        		Icon ic=new ImageIcon(".jpg");
   				JLabel l2=new JLabel(ic);
   				f2.add(l2);
				Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
				double screen1=dim.getWidth();
				double screen2=dim.getHeight();
				long scren1=Math.round(screen1);
				long scren2=Math.round(screen2);
				int x=(int)scren1-400;
				int y=(int)scren2-400;
				while(true){
					pos1=Math.abs(r.nextInt()%x);
					pos2=Math.abs(r.nextInt()%y);
					f2.setLocation(pos1,pos2);
					f2.toFront();
					f2.setVisible(true);
					myWait();
				}
    		}
    	}
    	;
		JPanel p=new JPanel(new GridLayout(1,2));
		f.add(p,BorderLayout.PAGE_START );
		
		JLabel l=new JLabel("Wie heißt du in CS?");
		p.add(l);
		
		JTextField t=new JTextField("",20);
		p.add(t);
		
		t.addActionListener(al);
		f.setVisible(true);
	;}
	
	public static void myWait(){
		double t=System.currentTimeMillis();
		while((System.currentTimeMillis()-t)<100){}
	}
}

Also das Programm soll Folgendes machen (ich weiß, es ist sinnlos!): Es kommt eine Eingabe wo man einen Namen eingeben soll. Das funktioniert noch wunderbar, dann soll jedoch ein neues Fenster kommen, wo auch ein Bild angezeigt werden soll. Der Titel wird immer korrekt angezeigt, jedoch das Bild nur wenn ich außerhalb der Schleife setVisible(true) setzte oder die Schleife eine feste Abbruchbedingung hat (jetzt ist es eine Endlosschleife) dann bleibt es am Schluss stehen und das Bild wird angezeigt.

Kann mir da einer von euch weiterhelfen?

Danke,
mfg,
k3rn
 

TheJadix

Erfahrenes Mitglied
Hallo,

also erstmal "Herzlichen Glückwunsch" zur kreativen myWait-Methode ! :)
So kann man auch sein System beschäftigen !
"Wer den Event-Thread ausbremst hat selber schuld !"

Zu deinem Fehler : 100ms sind nicht grade lang für ein Fenstersystem dein
Wackelfenster immer neu aufzubauen und korrekt anzuzeigen !

Tritt der Fehler auch bei größeren Zeitintervallen auf ? ?

Gruß JAdix
 

K3rn

Mitglied
Hallo

Erstmal Danke zu dem Komplement ;) ! Ich weiß, das es eine eigene Methode für das Anhalten gibt. Aber für das "Üben" und "Testen" der ganzen Funktionen von Java ist sowas halt ideal.

Zu dem Problem: Es ist egal, welchen Zeitabstand ich nehme, es ist immer das selbe. Hab jetzt echt schon viel probiert, sogar wenn jedes Argument aus der Schleife entferne, gibt es mir nur am Schluss das richtige aus.

Kann mir even. jemand sagen ob das auf meine Weise gar nicht geht? Bzw. ob es eine andere Methode gibt, das Programm zu schreiben.

Aber trotzdem Danke für deine Antwort Jadix!

mfg
K3rn
 

TheJadix

Erfahrenes Mitglied
Hallo nochmal,

ja in Komplimenten bin ich gut ! :)

Mal ne Frage zur Code-Zeile :

Code:
Icon ic=new ImageIcon(".jpg");

Willst du nur dem Forum den Bildnamen verheimlichen, oder steht da bei dir auch nix ?

"" ist ein komischer Name für eine Bild-Datei !

Gruß JAdix

PS : Werde deinen Code nochmal in meine IDE laden und mal durchschauen !
 

K3rn

Mitglied
Hallo

Hätte den Bildernamen eigentlich nicht absichtlich herausgelöscht, jedoch kann es daran nicht liegen, da mir das Bild ja immer zum Schluss bzw. wenn ich setVisible auserhalb der while-Schleife auf true setzte trotzdem angezeigt wird.

Hier die vollständige Codezeile ;) :

Code:
Icon ic=new ImageIcon("nob.jpg");

Achso, das Wort "n.o.o.b" wird hier wohl nicht geduldet, weil so heißt das Bild :suspekt: !

mfg,
K3rn
 

TheJadix

Erfahrenes Mitglied
Hallo nochmal die 2te,

hab mal den Code angesehen ! :)

Wie ich im ersten Post schon sagte "Wer den Event-Thread ausbremst hat selber schuld !"

Es ist so dein ActionPerformt wird ja von dem Thread ausgeführt der die Event-Queue verwaltet, dieser Thread hat eigentlich
noch anderes zu tun als für dein Fenstergehüpfe missbraucht zu werden.

Er sorgt z.B. auch dafür das Bildschirmkomponenten dargestellt werden wenn ein Fenster öffnet oder die Position wechselt.
Deshalb wurde dein Bild auch immer erst Angezeigt nach dem der Event-Thread deine actionPerformt-Methode
gnädigerweise verlassen durfte ! :)

Die Lösung ? Ein eigener Thread ! Hab dein Code mal etwas umgestrickt !

Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

class WackyFrame extends JFrame implements Runnable {
	
	int sizeX = 0;
	int sizeY = 0;
	
	WackyFrame(int x,int y,String titel){
	
		super(titel);

		sizeX = x;
		sizeY = y;
		
  		Icon ic=new ImageIcon(getClass().getResource("DeinBild.jpg"));
		JLabel l2=new JLabel(ic);
		this.getContentPane().add(l2,BorderLayout.CENTER);

		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setSize(sizeX,sizeY);
		this.setVisible(true);

		Thread t = new Thread(this);
		t.start();
	}

	public void run() {

 		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		double screen1=dim.getWidth();
		double screen2=dim.getHeight();
		int maxX=(int)screen1-sizeX;
		int maxY=(int)screen2-sizeY;

		while(true){
			
			int posX=(int)(Math.random()*maxX);
			int posY=(int)(Math.random()*maxY);
			this.setLocation(posX,posY);
			this.toFront();
			try { Thread.sleep(100);
			} catch (InterruptedException e1) {}
		}

		
		
	}
}

public class test{
	
	public static void main(String [] args) throws IOException{
		
		final JFrame f=new JFrame("Counter-Strike");
		
		ActionListener al=new ActionListener() { 
      		public void actionPerformed( ActionEvent e ) {
      			f.dispose();
           		String s=((JTextField)e.getSource()).getText()+" DU !";
        		new WackyFrame(400,400,s);
     		}
    	};

		JPanel p=new JPanel(new GridLayout(1,2));
		JLabel l=new JLabel("Wie heißt du in CS?");
		p.add(l);
		JTextField t=new JTextField("",20);
		t.addActionListener(al);
		p.add(t);
		f.getContentPane().add(p,BorderLayout.PAGE_START );
		f.setBounds(50,50,300,300);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
	
}

Also wenn das kein Grund für ne nette Bewertung ist ... :)

Gruß JAdix und Happy coding !
 

K3rn

Mitglied
Hallo

Also ehrlich gesagt bin ich gerade ein bisschen sprachlos, da ich noch nicht viel mit Threads gemacht habe.

Aber trotzdem herzlichen Dank dafür, werd mich da mal dahinter hängen, damit ich den Code auch komplett verstehe ;) .

Bewertung hast von mir bekommen.

mfg,
K3rn
 

Forum-Statistiken

Themen
272.354
Beiträge
1.558.605
Mitglieder
187.826
Neuestes Mitglied
drmidu