2011-11-30 14 views
11
public class MinesweeperMenu extends MinesweeperPanel{ 

private JPanel picture = new JPanel(); 
private JButton play = new JButton("Play"); 
private JButton highScores = new JButton("High Score and \nStatistics"); 
private JButton changeMap = new JButton("Create Custom \nor Change Map"); 
private JButton difficulty = new JButton("Custom or\nChange Difficulty"); 
private JButton user = new JButton("Change User"); 
Image img; 

public MinesweeperMenu() 
{ 
    // Set Layout for the menu 
    LayoutManager menuLayout = new BoxLayout(menu, BoxLayout.Y_AXIS); 
    menu.setLayout(menuLayout); 

    // Set Layout for the window 
    LayoutManager windowLayout = new BorderLayout(); 
    window.setLayout(windowLayout); 

    // Add buttons to the panels 
    menu.add(play); 
    menu.add(highScores); 
    menu.add(changeMap); 
    menu.add(difficulty); 
    menu.add(user); 

    // Add picture to the frame 
    try{ 
    File input = new File("./setup/images/MineMenuPicture.jpg"); 
    img = ImageIO.read(input); 
    } 
    catch(IOException ie) 
    { 
     System.out.println(ie.getMessage()); 
    } 

    // Add action listeners 
    changeMap.addActionListener(new ChangeMapListener()); 

} 


public void paintComponent(Graphics g) 
{ 
    // POSITION OF THE PICTURE 
    int x = 650; 
    int y = 585; 
    g.drawImage(img, x, y, null); 
} 

public void displayFrame() 
{ 
    // Display Frame 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setVisible(true); 
} 

public static void main(String[] args) 
{ 
    MinesweeperMenu menu = new MinesweeperMenu(); 
    window.pack(); 
    menu.displayFrame(); 
    window.repaint(); 
} 
} 


public class MinesweeperPanel extends JFrame{ 

public static final Color COLOR_KEY = new Color(220, 110, 0); 

// Initialize all the objects 
public static JFrame window = new JFrame("Minesweeper++"); 
public static JPanel menu = new JPanel(); 

// Close the current window 
public static void close() 
{ 
    window.setVisible(false); 
    window.dispose(); 
} 



} 

Non riesco a visualizzare l'immagine nel frame. Ho provato di tutto, ma ho l'impressione che sia un errore che non sto realizzando da quando sono nuovo in Java Swing. Qualsiasi aiuto sarebbe molto apprezzato.Visualizzazione di un'immagine in Java Swing

+0

Hai controllato per assicurarsi che img! = Null? Avrei eseguito il debug o il controllo con una dichiarazione di stampa prima di disegnarla per assicurarmi che l'immagine fosse impostata correttamente. –

+0

'new JButton (" Punteggio alto e \ nStatistica ");' 'JButton' non supporta interruzioni di riga. È possibile utilizzare l'HTML per ottenere un'interruzione di riga, ma il pulsante apparirà errato se disabilitato. –

risposta

31

Stai facendo le cose difficili per te da avere una struttura di programma molto confusione, e vi suggerisco di semplificare le cose un sacco .

Per uno, non è necessario per la classe MinesweeperMenu corrente estendere MinesweeperPanel e per quest'ultima classe estendere JFrame. Quindi hai una JFrame statica da qualche altra parte - sono troppi JFrames, e per l'avvio, stai cercando di mostrare la tua immagine in una JFrame ma mostrando l'altra che non ha l'immagine. Il tuo programma ha bisogno di un solo JFrame e probabilmente dovrebbe essere creato, riempito con il suo contenuto, imballato e visualizzato in un unico posto, non sparsi qua e là come stai facendo.

Si sta provando a visualizzare l'immagine in un override paintComponent, ma questo metodo non verrà mai chiamato poiché la classe estende JFrame (eventualmente) e JFrame non ha questo metodo. Stai utilizzando il metodo giusto, ma la classe dovrebbe estendere JPanel e dovresti avere un'annotazione @Override sopra il blocco del metodo paintComponent per essere sicuro che stai sovrascrivendo un metodo genitore.

Si dovrebbe sbarazzarsi di all statico tutto in questo programma. L'unica cosa statica qui dovrebbe essere il metodo principale e forse alcune costanti, ma il gioco è fatto.

Ci sono più errori qui e ho troppo poco tempo per esaminarli tutti. Prendi in considerazione l'idea di iniziare dall'inizio, iniziando in piccolo, facendo in modo che piccoli bit funzionino e quindi aggiungendoli insieme.

Ad esempio, prima creare un programma molto piccolo che tenta di leggere un'immagine in un oggetto Immagine, posizionarlo in un ImageIcon, posizionare ImageIcon in una JLabel e visualizzare la JLabel in un JOptionPane, quella semplice, solo per vedere se si può leggere nelle immagini OK, per esempio, qualcosa di simile:

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class TestImages { 

    // *** your image path will be different ***** 
    private static final String IMG_PATH = "src/images/image01.jpg"; 

    public static void main(String[] args) { 
     try { 
     BufferedImage img = ImageIO.read(new File(IMG_PATH)); 
     ImageIcon icon = new ImageIcon(img); 
     JLabel label = new JLabel(icon); 
     JOptionPane.showMessageDialog(null, label); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
    } 
} 

Poi, quando hai fatto questo, vedere se è ora possibile creare un JPanel che mostra la stessa immagine nel suo metodo paintComponent, e mostra questo JPanel in un JOptionPane.

Quindi creare un JFrame e visualizzare JPanel contenente l'immagine nella JFrame.

Attraverso iterazioni successive testerai i concetti, correggerai gli errori e costruirai il tuo programma.

+0

Stai rendendo le cose difficili per te avendo una struttura del programma molto confusa, e ti suggerisco di semplificare molto le cose. ...sembra che le lezioni di vita ... :) –

6
File input = new File("./setup/images/MineMenuPicture.jpg"); 

Se MineMenuPicture.jpg è una risorsa di applicazione, dovrebbe essere in un vaso e vi si accede tramite URL ottenuti da Class.getResource(String).

+0

bella ripresa! 1+ –