Java Grafiken werden fehlerhat angezeigt

Hallo!

Ich will in einem kleinen JFrame ein Hintergrundbild festlegen. Mein Problem aber ist, dass das Teile des Hintergrundbildes erst angezeigt werden, sobald man einen Teil des Fensters außerhalb des Desktops schiebt:

http://www.imagebanana.com/view/qnc4todf/screen1.gif
http://www.imagebanana.com/view/v04k7cbt/screen2.gif

Desweiteren wird der Login-Button ausgeblendet, sobald sich das Bild darüber befindet. Wenn man jedoch mit dem Mauszeiger über die Stelle des Buttons fährt, erscheint er wieder.
Außerdem werden den Labels die zugewiesenen Fonts nicht angezeigt.

Quellcode:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;

public class frame extends JFrame {
// Anfang Attribute
private JButton login = new JButton();
private TextField accpass = new TextField();
private TextField accname = new TextField();
private Label acc = new Label();
private Label pass = new Label();
Image img;

// Ende Attribute

public frame(String title) {
// Frame-Initialisierung
super("…");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 1024;
int frameHeight = 768;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten

login.setBounds(384, 440, 209, 41);
login.setText(„LOGIN“);
login.setMargin(new Insets(2, 2, 2, 2));
login.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
login_ActionPerformed(evt);
}
});
login.setFont(new Font(„Aniron“, Font.PLAIN, 13));
cp.add(login);
accpass.setBounds(384, 392, 209, 32);
accpass.setText("");
accpass.setFont(new Font(„MS Sans Serif“, Font.PLAIN, 17));
cp.add(accpass);
accname.setBounds(384, 320, 209, 32);
accname.setText("");
accname.setFont(new Font(„MS Sans Serif“, Font.PLAIN, 17));
cp.add(accname);
acc.setBounds(384, 272, 190, 39);
acc.setText(„Accountname:“);
acc.setFont(new Font(„Aniron“, Font.PLAIN, 17));
cp.add(acc);
pass.setBounds(384, 352, 150, 39);
pass.setText(„Passwort:“);
pass.setFont(new Font(„Aniron“, Font.PLAIN, 17));
cp.add(pass);
img = Toolkit.getDefaultToolkit().createImage(„title.jpg“);

// Ende Komponenten

setResizable(false);
setVisible(true);
}

public void paint(Graphics g)
{
g.drawImage(img, 0, 0, null);
}

// Anfang Methoden
public void login_ActionPerformed(ActionEvent evt) {
// TODO hier Quelltext einfügen
}

// Ende Methoden

public static void main(String[] args) {
new frame(„frame“);
}
}

_______________________________________

Danke schonmal für jede hilfreiche Antwort.
PS: Bin noch Anfänger im Bereich JFrame :wink:

Servus,

habe den Code jetzt zwar nicht getestet, aber es könnte ein Problem damit geben, dass du die paint-Methode überschreibst.
Die Labels würden in deinem Code nicht mehr gerendert werden => damit nicht angezeigt.

Verbesserungsvorschläge:

  • Überschreibe nicht das JFrame, sondern benutze ein ImageIcon in Kombination mit einem JLabel, um dein Bild anzuzeigen.
  • Stelle sicher, dass es die Fonts auf jedem System gibt (ich hab „Aniron“ nicht)
  • Versuche, das Null-Layout zu meiden. Wenn du ein Layout mit vielen Möglichkeiten brauchst, nimm das GridBagLayout. Ein schönes Beispiel hierzu findest du im Openbook „Java ist auch eine Insel“ von Galileo Press.

Grüße
Michi

Servus,

Die zwei Ebenen kannst du durch ein GlassPane erzeugen. Für die Verwendung siehe http://www.java2s.com/Code/Java/Swing-JFC/Demonstrat…

Grüße
Michi