0

そのため、ユーザーが他の画像とは異なる画像をクリックする Java でゲームを作成しています。レベルの画像は既に作成されていますが、ユーザーが画像の特定の場所をクリックすると、ゲームが反応して次の画像に移動するようにしたいだけです。(すべての画像は既に配列に配置されています。) ゲームは最初の画像で開くように設定されています。これが私のコードです:

    package Final;

    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.*; 

    import javax.swing.JFrame;


    public class drawPictures extends JFrame implements MouseListener { //it implements this     because I want the user to click stuff
    //Now I need to declare the images that serve as my levels variables ahead of time.
    protected static Image levelOne;
    protected static Image levelTwo;
    protected static Image levelThree;
    protected static Image levelFour;
    protected static Image levelFive;
    protected Graphics g = this.getGraphics();  

    //Done declaring.

    //Now to load the images
    private static Image loadImage(String imgFileName) { 
        Image img = null;
        try {
            Toolkit tk = Toolkit.getDefaultToolkit();
            img = tk.getImage(imgFileName);
        } catch (Exception e) {
            System.err.println("Image not found: "+ imgFileName);
        }

        return img;
    } //done loading the images



    static Image [] pictureArray = new Image[5]; { //This is the array that will store all of     the images
     //otherwise known as the "levels"
    pictureArray[0] = levelOne; //each "slot" in the array is taken up by one 
    //of the images that serves as the level
    pictureArray[1] = levelTwo;
    pictureArray[2] = levelThree;
    pictureArray[3] = levelFour;
    pictureArray[4] = levelFive;
    }

    /*
     * Now that the actual array that stores the levels has been created
     * I need to create a method that "paints" the level, 
     * and moves on to the next one when the user clicks on something.
     * 
     * I also need to create a box with dimensions 151x159 
     * overtop of the happy tomato in the first level.
     * That will be the 
     */

    public drawPictures() {
     super("One of These Things Doesn't Belong...");


     setSize(1500, 750);
     setDefaultCloseOperation(EXIT_ON_CLOSE); // Creates the "x" box.
     setVisible(true); // Makes the window visible.    

     start();
 }

 public void paint(Graphics g) {
     g.drawImage(pictureArray[0], 100, 100, this);
 }

 public static void start() 
 /*
  * this entire method exists for the sole purpose of loading the images
  * that I placed in the variables that I declared above.
  * WHY IS PROGRAMMING SO DARN TEDIOUS???
  */
    {
    levelOne = loadImage("Level 1.jpg");
    levelTwo = loadImage("Level 2.jpg");
    levelThree = loadImage("Level 3.jpg");
    levelFour = loadImage("Level 4.jpg");
    levelFive = loadImage("Level 5.jpg");
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        start();
        new drawPictures(); 
    }
}
4

2 に答える 2

1

フレームにマウス リスナーを追加することはありません。

そうは言っても...

  • 次のような最上位のコンテナからの拡張は避ける必要があります。JFrame
  • 最上位のコンテナーへの描画は避ける必要があります (いずれかのpaintメソッドをオーバーライドすることにより) 。
  • super.paintXxxペイントメソッドはかなり複雑で、多くの非常に重要な作業を実行するため、(そうしないと信じられないほどの正当な理由がない限り)常に呼び出す必要があります。
  • 大きな画像をロードしたり、インターネットから画像をダウンロードしたりしない限り (その場合でも) ImageIO、. より多くの画像をサポートしています。

マウス クリック イベントでは、表示を開始する現在の画像を特定する必要があります。境界を決定し、その中でマウスがクリックされたかどうかを決定する必要があります。

// Current index maintains the index of the current image...
// You should replace g.drawImage(pictureArray[0], 100, 100, this) with
// g.drawImage(pictureArray[currentIndex], 100, 100, this)
Image currentImage = pictureArray[currentIndex];
Rectangle bounds = new Rectangle(100, 100, currentImage.getWidth(this), currentImage.getHeight(this));
if (bounds.contains(arg0.getPoint()) {
  // Image was clicked...
  currentIndex++;
  if (currentIndex >= pictureArray.length) {
      currentIndex = 0;
  }
  repaint();
}

例で更新

これは大雑把な例です。基本的にはJPanelイメージをペイントするカスタムを使用します。これに を追加しMouseListenerます。

メイン プログラムはフォルダを使用してスクロールし、クリックすると画像パネルに各 (有効な) 画像を表示します。

マウス クリックは、画像パネル自体のコンテキスト内でのみ発生します。

public class ImageScoller {

    public static void main(String[] args) {
        new ImageScoller();
    }

    public ImageScoller() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ImageViewPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ImageViewPane extends JPanel {

        private ImagePane imagePane;
        private File[] fileList;
        private int currentIndex = -1;

        public ImageViewPane() {

            fileList = new File("/path/to/some/folder/with/images").listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return pathname.isFile();
                }
            });

            imagePane = new ImagePane();
            imagePane.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    nextImage();
                }
            });
            setLayout(new GridBagLayout());
            add(imagePane);

            nextImage();
        }

        public void nextImage() {
            if (fileList != null && fileList.length > 0) {
                currentIndex++;
                if (currentIndex < 0 || currentIndex >= fileList.length) {
                    currentIndex = 0;
                }
                Image image = null;
                /*
                    Because I don't know the contents of the folder, this is a little
                    more complicated then it really needs to be.

                    If you know the file is an image, you can simply use ImageIO.read(file)
                */
                while (image == null && currentIndex < fileList.length) {
                    System.out.println("Loading next image: " + currentIndex);
                    try {
                        ImageInputStream iis = ImageIO.createImageInputStream(fileList[currentIndex]);
                        if (iis != null) {
                            Iterator<ImageReader> imageReaders = ImageIO.getImageReaders(iis);
                            if (imageReaders != null && imageReaders.hasNext()) {
                                ImageReader imageReader = imageReaders.next();
                                imageReader.setInput(iis);
                                image = imageReader.read(0);
                            } else {
                                currentIndex++;
                            }
                        } else {
                            currentIndex++;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        currentIndex++;
                    }
                }
                imagePane.setImage(image);
                invalidate();
                repaint();
            }
        }
    }

    public class ImagePane extends JPanel {

        private Image image;
        private JLabel label;

        public ImagePane() {
            setLayout(new GridBagLayout());
            label = new JLabel("No image available");
            add(label);
        }

        public void setImage(Image value) {
            if (image != value) {
                image = value;
                label.setVisible(image == null);
                repaint();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return image == null ? super.getPreferredSize() : new Dimension(image.getWidth(this), image.getHeight(this));
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (image != null) {
                int width = getWidth();
                int height = getHeight();
                int x = (width - image.getWidth(this)) / 2;
                int y = (height - image.getHeight(this)) / 2;
                g.drawImage(image, x, y, this);
            }
        }
    }
}
于 2012-12-06T00:36:46.720 に答える
0

画像の上に目に見えないオブジェクトが必要なのはなぜですか?

とにかく、あなたの質問に答えるために、あなたのイメージと同じ場所にJPanelを作成してください。

JPanel yourPanel = new JPanel()画像と同じ場所に設定します。
JPanel で MouseListener を作成します。

yourpPanel.addMouseListener( new MouseAdapter() {
   @Override
   public void mousePressed( MouseEvent evnt ){
      // Your code when clicked here
   }
});</code>
于 2012-12-06T00:35:17.420 に答える