2011-11-30 18 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(); 
} 



} 

No consigo que mi imagen se muestre en el marco. He intentado todo, pero me da la impresión de que es un error que no me estoy dando cuenta, ya que soy nuevo en Java Swing. Cualquier ayuda sería muy apreciada.Mostrar una imagen en Java Swing

+0

¿Ha comprobado para asegurarse de que img! = Null? Me gustaría depurar o poner un cheque con una declaración de impresión antes de dibujar para asegurarse de que la imagen se está configurando correctamente. –

+0

'nuevo JButton (" Puntuación más alta y \ nEstados estadísticos ");' 'JButton' no admite saltos de línea. Es posible usar HTML para obtener un salto de línea, pero luego el botón se verá mal cuando esté desactivado. –

Respuesta

31

Estás haciendo las cosas difíciles para ti mismo por tener una estructura de programa muy confuso, y yo sugeriría que se simplifica mucho las cosas.

Para empezar, no es necesario que su clase MinesweeperMenu actual amplíe MinesweeperPanel, y para la última clase amplíe JFrame. Luego tiene un JFrame estático en otro lugar, son demasiados JFrames, y para empezar, está tratando de mostrar su imagen en un JFrame pero mostrando el otro que no tiene la imagen. Su programa necesita solo un JFrame y probablemente debería ser creado, rellenado con su contenido, empaquetado y exhibido en un solo lugar, no disperso aquí y allá mientras lo hace.

Está tratando de mostrar la imagen en una anulación de paintComponent, pero este método nunca se llamará ya que su clase se extiende JFrame (eventualmente) y JFrame no tiene este método. Estás utilizando el método correcto, pero la clase debería extender JPanel, y debes tener una anotación @Override sobre el bloque de método paintComponent para asegurarte de que estás reemplazando a un método principal.

debe deshacerse de todo todo lo estático en este programa. Lo único estático aquí debería ser el método principal y quizás algunas constantes, pero eso es todo.

Aquí hay más errores, y tengo muy poco tiempo para revisarlos todos. Considere empezar desde el principio, comenzar de a poco, hacer que funcionen pequeños bits y luego sumarlos.

Por ejemplo, primero cree un programa muy pequeño que intente leer en una imagen en un objeto de imagen, colóquelo en un ImageIcon, coloque el ImageIcon en un JLabel y visualice el JLabel en un JOptionPane, así de simple, solo para ver si se puede leer en las imágenes OK, por ejemplo, algo como esto:

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(); 
     } 
    } 
} 

Entonces, cuando usted ha hecho esto, a ver si ahora puede crear un JPanel que muestra la misma imagen en su método paintComponent, y mostrar este JPanel en JOptionPane.

A continuación, cree un JFrame y visualice el JPanel que contiene la imagen en el JFrame.

A través de sucesivas iteraciones probarás conceptos, corregirás errores y crearás tu programa.

+0

Estás haciendo las cosas difíciles para ti al tener una estructura de programa muy confusa, y te sugiero que simplifiques las cosas mucho. ...parece lecciones de vida ... :) –

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

Si MineMenuPicture.jpg es un recurso de aplicación, debe ser en un tarro y se accede por la URL obtenida de Class.getResource(String).

+0

¡buena recogida! 1+ –