2016-11-28 2 views
1

Ich habe vor kurzem eine Systemhomepage programmiert, die das Hintergrundbild enthält. Nachdem ich den Hintergrund eingestellt habe, kann die Schaltfläche, die ich erstellt habe, nicht richtig angezeigt werden. Es erscheint nur nachdem ich die Maus benutze und auf die Position der Buttons zeige. Kann mir jemand beibringen, wie ich dieses Problem beheben kann? Ihre Hilfe wird geschätzt. Die Codes sind wie folgt: (wahrscheinlich ein Tippfehler)Warum die Schaltfläche auf dem JFrame mit Hintergrundbild nicht richtig angezeigt werden kann

public class HomePage JFrame erweitert {

private JPanel button = new JPanel(); 
private JButton time = new JButton("Bus Schedule"); 
private JButton reserve = new JButton("Booking"); 
private JButton info = new JButton("About Us"); 
Container con = getContentPane(); 


public HomePage(){ 

    setTitle("Bus Reservation System"); 
    setSize(650,500); 
    setLocation(360,100); 
    setVisible(true); 
    setResizable(false); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

    setBackground(); 
    setButton(); 
} 


public void setBackground(){ 

    JLabel background = new JLabel(new ImageIcon("C:/User/Desktop/Assignment/bg.jpg")); 
    con.add(background); 
    background.setLayout(new FlowLayout()); 
    con.add(button); 

} 


public void setButton(){ 

    Font but = new Font("Serif" , Font.ITALIC , 20); 

    info.setFont(but); 
    time.setFont(but); 
    reserve.setFont(but); 

    button.add(info); 
    button.add(time); 
    button.add(reserve); 

    con.add(button); 

} 

Antwort

1

Einfache Fehler, Sie setzen das Layout der JLabel, sollten Sie das Layout der Container einstellen . Do con.setLayout(new FlowLayout()); anstelle von background.setLayout(...)

Auch glaube ich, dass Ihr Pfad zu der Datei falsch ist. Zum Testen legen Sie einfach die Datei in das Projekt und machen einen Pfad wie "bg.jpg". Wenn das funktioniert, können wir dies überprüfen. Für mich funktioniert das. Der Grund, warum ich das glaube, liegt darin, dass Sie C:/Users angeben, aber geben Sie niemals den Ordner für den bestimmten Benutzer an. Ein korrekter Pfad wäre C:/Users/Your_name/Desktop/Assignment/bg.jpg

Ich weiß nicht sicher auf diesem Pfad Teil, da ich nicht auf Ihrem System bin. Für mich jedoch, wenn ich Ihren Code in meiner Eclipse ausführen, behebt dies es.

edit: Eine letzte Sache, das Bild wird nicht wirklich ein "Hintergrund" Bild mit dem aktuellen Code sein, weil es die Tasten unter es anstatt mit dem FlowLayout darüber bewegen wird. Vielleicht möchten Sie ein anderes Layout verwenden.

1

Nach dem Aufruf setVisible(true), wenn Sie bestimmte Aktionen ausführen, müssen Sie manuell validate() oder revalidate() Ihr Fenster.

Es ist einfacher, einfach setVisible() aufzurufen, nachdem Sie alle gewünschten Einstellungen und die Mitgliedschaft im Fenster initialisiert haben.

/* setVisible(true); -- wrong place */ 
setResizable(false); 
setDefaultCloseOperation(EXIT_ON_CLOSE); 
setBackground(); 
setButton(); 
setVisible(true); // proper place 
+1

Das ist richtig, froh, dass du es erwähnt hast. Aber, scheint nicht die Wurzel des Problems zu sein, selbst mit dieser Änderung wird die Bilddatei nicht angezeigt. (Ich teste seinen genauen Code auf meinem System). Was es funktionierte, war das Ändern des Pfads und das Festlegen des Layouts des gesamten Containers. –

+0

@AshwinGupta Ausgezeichneter Punkt; Ich verpasste das Layout des JLabel statt Container mit nur einer visuellen Überprüfung des Codes. – AJNeufeld

+0

Ty. Ich weiß, wie das ist. Ich habe es auch das erste Mal vermisst (und das, worauf Sie hingewiesen haben). Deshalb habe ich es auf meinem System getestet, habe keine Fehler festgestellt und war neugierig, warum es nicht funktionierte. Das war, als ich das Problem fand. –

0

Zunächst einmal, wie bereits erwähnt, sollten alle Komponenten an den Rahmen vor setVisible(true) Aufruf auf der JFrame hinzugefügt werden.

JLabel background = new JLabel(new ImageIcon("C:/User/Desktop/Assignment/bg.jpg")); 
con.add(background); 
background.setLayout(new FlowLayout()); 
con.add(button); 

auf dem obigen Code Basierend zwei Komponenten Inhaltsbereich hinzufügen, so dass die Hierarchie Ihrer GUI wie folgt aussieht:

- frame 
    - content pane 
     - background 
     - button 

Es scheint mir, Sie Ihre GUI wie folgt aussehen wollen :

- frame 
    - content pane 
     - background 
      - button 

So sollte Ihr Code sein:

JLabel background = new JLabel(new ImageIcon("C:/User/Desktop/Assignment/bg.jpg")); 
con.add(background); 
background.setLayout(new FlowLayout()); 
//con.add(button); 
background.add(button); 
Verwandte Themen