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



} 

フレームに画像を表示できません。私はすべてを試しましたが、私はJava Swingを初めて習得して以来私が実現していない間違いであるという印象を受けています。どんな助けでも大歓迎です。Java Swingで画像を表示

+0

img!= nullであることを確認しましたか?私はデバッグするか、イメージが正しく設定されていることを確認するために描画する前に、printステートメントでチェックを入れます。 –

+0

'新しいJButton("ハイスコアと\ n統計 ");' 'JButton'は改行をサポートしていません。 HTMLを使用して改行することはできますが、無効にするとボタンが正しく表示されません。 –

答えて

31

あなたは非常に混乱プログラム構造を持つことによって、自分のために物事を困難にしている、と私はあなたが物事にたくさんを簡素化することを示唆しています。

1つは、現在のMinesweeperMenuクラスがMinesweeperPanelを拡張する必要はなく、後者のクラスがJFrameを拡張する必要はありません。次に、JFrameが静的なJFrameがあります.JFrameが多すぎます。起動するには、1つのJFrameに画像を表示していて、画像がないものを表示しています。あなたのプログラムはただ1つのJFrameしか必要とせず、おそらくここでそこに散らばっていない、1つの場所にパックされて表示され、作成され、内容が詰まっているはずです。

paintComponentオーバーライドで画像を表示しようとしていますが、クラスがJFrameを継承し(最終的に)JFrameにこのメソッドがないため、このメソッドは呼び出されません。適切なメソッドを使用していますが、クラスはJPanelを拡張する必要があります。実際に親メソッドをオーバーライドしていることを確認するには、paintComponentメソッドブロックの上に@Override注釈が必要です。

あなたはこのプログラムですべて静的なすべてのものを取り除く必要があります。ここで静的なのは、主な方法と、おそらくいくつかの定数だけですが、それだけです。

ここではエラーが多く、すべてを調べる時間がありません。最初から始め、小さいものから小さなものまで、そしてそれを一緒に加えることを考えてみましょう。

たとえば、イメージをImageオブジェクトに読み込み、ImageIconに配置し、ImageIconをJLabelに配置し、JLabelをJOptionPaneに表示する非常に小さなプログラムを作成します、あなたは今、そのpaintComponentメソッドに同じ画像を表示するJPanelを作成することができるかどうか、

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

その後、あなたはこれをやったとき:あなたが画像を読み込むことができればOK、例えば、このような何かを参照しますこのJPanelをJOptionPaneに表示します。

次に、JFrameを作成し、画像保持JPanelをJFrameに表示します。

繰り返しの反復で、概念をテストし、間違いを修正し、プログラムを構築します。

+0

あなたは非常に混乱しやすいプログラム構造を持つことで、自分自身にとって難しいことをしています。私はあなたが多くを単純化することを提案します。 ...人生の教訓のように思える... :) –

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

MineMenuPicture.jpgがアプリケーション・リソースである場合、それは瓶であっとClass.getResource(String)から得られるURLによってアクセスされるべきです。

+0

素敵なピックアップ! 1+ –