13
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を初めて使用するので、気付いていないのは間違いだという印象を受けます。どんな助けでも大歓迎です。

4

2 に答える 2

37

あなたは非常に紛らわしいプログラム構造を持っていることによってあなた自身のために物事を難しくしています、そして私はあなたが物事をたくさん単純化することを提案します。

1つは、現在のMinesweeperMenuクラスでMinesweeperPanelを拡張する必要がなく、後者のクラスでJFrameを拡張する必要がないことです。次に、静的なJFrameが別の場所にあります。これはJFrameが多すぎるため、起動するには、1つのJFrameに画像を表示しようとしていますが、画像のない別のJFrameを表示しています。プログラムに必要なJFrameは1つだけです。おそらく、JFrameを作成し、その内容を詰め込み、パックして1つの場所に表示し、実行中のあちこちに散らばらないようにする必要があります。

絵をpaintComponentオーバーライドで表示しようとしていますが、クラスがJFrameを拡張し(最終的に)、JFrameにこのメソッドがないため、このメソッドが呼び出されることはありません。正しいメソッドを使用していますが、クラスはJPanelを拡張している必要があり、@Override実際に親メソッドをオーバーライドしていることを確認するために、paintComponentメソッドブロックの上にアノテーションを付ける必要があります。

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

ここにはさらに多くのエラーがあり、すべてを調べる時間が少なすぎます。最初から始めて、小さなものから始めて、小さなビットを機能させてから、それらを足し合わせることを検討してください。

たとえば、最初に画像をImageオブジェクトに読み込んでImageIconに配置し、ImageIconをJLabelに配置し、JOptionPaneにJLabelを表示する非常に小さなプログラムを作成します。たとえば、次のような画像でOKを読み取ることができます。

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

次に、これを行ったら、paintComponentメソッドで同じ画像を表示するJPanelを作成し、このJPanelをJOptionPaneに表示できるかどうかを確認します。

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

連続した反復を通じて、概念をテストし、間違いを修正し、プログラムを構築します。

于 2011-11-30T22:44:39.083 に答える
6
File input = new File("./setup/images/MineMenuPicture.jpg");

がアプリケーションリソースの場合MineMenuPicture.jpg、Jar内にあり、から取得したURLでアクセスする必要がありますClass.getResource(String)

于 2011-11-30T23:02:53.697 に答える