Componente werden nicht angezeigt,

Status
Nicht offen für weitere Antworten.

Developer_X

Top Contributor
Hallo, ich habe im folgenden Code, 3 Componente, die geadded werden sollen, aller dings taucht am Ende nur 1 auf, wieso?
das Frame und alles läuft wie geplant, doch am Ende erscheint nur der Button "Start"
Java:
package Start;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class MainMenu extends JFrame {
	BufferedImage img;
	Toolkit tk;
	@SuppressWarnings("static-access")
	Dimension d = tk.getDefaultToolkit().getScreenSize();

	public MainMenu() {

		Runnable gui = new Runnable() {

			@Override
			public void run() {
				setSize(d);
				setUndecorated(true);
				JButton b1 = new JButton("Start");
				add(b1);

				JButton b2 = new JButton("Spiel Laden");
				add(b2);

				JButton b3 = new JButton("Exit");
				add(b3);
				b3.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						System.exit(0);
					}
				});
				img = loadImage("F:/Project-Earth/Project-Earth.jpg");
				setLayout(new FlowLayout());
				setVisible(true);
			}
		};
		// GUI must start on EventDispatchThread:
		SwingUtilities.invokeLater(gui);

	}

	public static BufferedImage loadImage(String ref) {
		BufferedImage bimg = null;
		try {

			bimg = ImageIO.read(new File(ref));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bimg;
	}

	public static void main(String[] args) {

		new MainMenu();

	}

	public void paint(Graphics g) {
		g.setColor(Color.black);
		g.fillRect(0, 0, d.width, d.height);
		warte(2000);
		g.setFont(new Font("SF Movie Poster", 1, 20));
		g.setColor(Color.cyan);
		g.drawString("Project_Earth", d.width / 2 - 20, d.height / 2);
		warte(2000);
		g.drawImage(img, 0, 0, d.width, d.height, this);
		warte(2000);
	}

	public static void warte(long millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
		}
	}
}
 
Zum fünften mal: Man darf niemals was anderes als malen in einer paint bzw. paintComponent Methode machen, und schon garnicht Thread.sleep.

Oh mann...
 
so gehts aber auch nicht:
Java:
package Start;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class MainMenu extends JFrame {
	BufferedImage img;
	Toolkit tk;
	@SuppressWarnings("static-access")
	Dimension d = tk.getDefaultToolkit().getScreenSize();

	public MainMenu() {

		Runnable gui = new Runnable() {

			@Override
			public void run() {
				setSize(d);
				setUndecorated(true);
				JButton b1 = new JButton("Start");
				add(b1);

				JButton b2 = new JButton("Spiel Laden");
				add(b2);

				JButton b3 = new JButton("Exit");
				add(b3);
				b3.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						System.exit(0);
					}
				});
				img = loadImage("F:/Project-Earth/Project-Earth.jpg");
				setLayout(new FlowLayout());
				setVisible(true);
			}
		};
		// GUI must start on EventDispatchThread:
		SwingUtilities.invokeLater(gui);

	}

	public static BufferedImage loadImage(String ref) {
		BufferedImage bimg = null;
		try {

			bimg = ImageIO.read(new File(ref));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bimg;
	}

	public static void main(String[] args) {

		new MainMenu();

	}

	public void paint(Graphics g) 
	{	
		g.setFont(new Font("SF Movie Poster", 1, 20));
		g.setColor(Color.cyan);
		g.drawString("Project_Earth", d.width / 2 - 20, d.height / 2);
		g.drawImage(img, 0, 0, d.width, d.height, this);
	}
}
 
bei mir werden bei deinem Code alle 3 Buttons ohne Probleme angezeigt...

aber wie schon gesagt wurde überschreib lieber "paintComponent" UND ruf als erstes in "paintComponent" super.paintComponent auf
 
Genau deswegen sollte man sich mit grafischen Benutzeroberflächen so lange zurückhalten, bis man die Grundlagen verstanden hat.

Ark
 
aber wie schon gesagt wurde überschreib lieber "paintComponent" UND ruf als erstes in "paintComponent" super.paintComponent auf
für JPanel paintComponent,

in einem JFrame selber unter Swing am besten gar nicht direkt zeichen,
wenn aber, dann aber tatsächlich mit paint, und nicht paintComponent
 
"vielleicht" solltest das setLayout(new FlowLayout()) auch mal vor das Adden der Komponenten ziehen!!

wenn ichs vor das adden ziehe, passiert nichts, nur der erste Button "start" wird angezeigt...
look here, FlowLayout verschoben+ohne paintComponents
Java:
package Start;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class MainMenu extends JFrame {
	BufferedImage img;
	Toolkit tk;
	@SuppressWarnings("static-access")
	Dimension d = tk.getDefaultToolkit().getScreenSize();

	public MainMenu() {

		Runnable gui = new Runnable() {

			@Override
			public void run() {
				setSize(d);
				setUndecorated(true);
				setLayout(new FlowLayout());

				JButton b1 = new JButton("Start");
				add(b1);

				JButton b2 = new JButton("Spiel Laden");
				add(b2);

				JButton b3 = new JButton("Exit");
				add(b3);
				b3.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						System.exit(0);
					}
				});
				img = loadImage("F:/Project-Earth/Project-Earth.jpg");
				setVisible(true);
			}
		};
		// GUI must start on EventDispatchThread:
		SwingUtilities.invokeLater(gui);

	}

	public static BufferedImage loadImage(String ref) {
		BufferedImage bimg = null;
		try {

			bimg = ImageIO.read(new File(ref));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return bimg;
	}

	public static void main(String[] args) {

		new MainMenu();

	}

	public void paint(Graphics g) 
	{	
		g.setFont(new Font("SF Movie Poster", 1, 20));
		g.setColor(Color.cyan);
		g.drawString("Project_Earth", d.width / 2 - 20, d.height / 2);
		g.drawImage(img, 0, 0, d.width, d.height, this);
	}
}
 
Bei mir werden die Buttons ebenfalls angezeigt.
Ich denke mal das hat was damit zu tun, dass bei uns keine Bilder geladen, bzw geaddet werden.
Ich kenn mich da nciht so aus mit Oberflächen, aber kann man nicht eigentlich zwei Componenten überlappend darstellen ?
Ich denke es wäre ganz hilfreich, wenn du deine Button erstmal auf ein Panel addest und dann damit weitermachst. Das gleiche denke cih würde dem Bild auch nicht schaden.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben