java - Java 中鼠标单击框架中的图像不新鲜

标签 java swing jpanel mouseclick-event

第一次在 Jframe 上显示来自三个不同阵列的三个随机图像。 即使触发了 MouseClicked 方法,但框架中的图像也没有刷新。 每次单击“框架”时,我想刷新三个随机图像。 请帮忙

   import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;

import javax.swing.*;

public class Cards extends JFrame implements MouseListener {

    public static void main(String[] args) {
    JFrame frame = new Cards();     
        frame.setTitle("Cards");



        frame.setSize(500, 500);

        frame.setLocationRelativeTo(null);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);


        new Cards();

    }

    public Cards() {

        this.getContentPane().addMouseListener(this);

        cards1();
        cards2();
        cards3();

    }

    public void cards1() {

        ImageIcon[] images = new ImageIcon[10];
        for (int i = 1; i < images.length; i++) {

            images[i] = new ImageIcon("Drawables//Images//" + i + ".png");

        }

        int[] threeRandoms = new int[1];
        Random ran = new Random();

        for (int i = 0; i < threeRandoms.length; i++) {

            threeRandoms[i] = ran.nextInt(10);

        }

        setLayout(new GridLayout(1, 4, 5, 5));

        add(new JLabel(images[threeRandoms[0]]));

    }


    public void cards2() {

        ImageIcon[] images = new ImageIcon[10];
        for (int i = 1; i < images.length; i++) {

            images[i] = new ImageIcon("Drawables//Images1//" + i + ".png");

        }

        int[] threeRandoms = new int[1];
        Random ran = new Random();

        for (int i = 0; i < threeRandoms.length; i++) {

            threeRandoms[i] = ran.nextInt(10);

        }

        setLayout(new GridLayout(1, 4, 5, 5));

        add(new JLabel(images[threeRandoms[0]]));

    }

    public void cards3() {
        // this.getContentPane().addMouseListener(this);
        ImageIcon[] images = new ImageIcon[10];
        for (int i = 1; i < images.length; i++) {

            images[i] = new ImageIcon("Drawables//Images2//" + i + ".png");

        }

        int[] threeRandoms = new int[1];
        Random ran = new Random();

        for (int i = 0; i < threeRandoms.length; i++) {

            threeRandoms[i] = ran.nextInt(10);

        }

        // Labels with gridLayout

        setLayout(new GridLayout(1, 4, 5, 5));

        add(new JLabel(images[threeRandoms[0]]));

    }

    public void mouseClicked(MouseEvent e) {
        System.out.println("The frame was clicked.");
        new Cards();
    }

    public void mouseEntered(MouseEvent e) {
        System.out.println("The mouse entered the frame.");
    }

    public void mouseExited(MouseEvent e) {
        System.out.println("The mouse exited the frame.");

    }

    public void mousePressed(MouseEvent e) {
        System.out.println("The left mouse button was pressed.");

    }

    public void mouseReleased(MouseEvent e) {
        System.out.println("The left mouse button was released.");

    }

}

最佳答案

抱歉,我对你的代码感到困惑。一方面,您的 cards1()cards2()cards3() 方法看起来完全相同,如果是这样,为什么3种不同的方法?为什么不只是一种方法呢?在这些方法中,您似乎试图重复添加 JLabels。您是否正在尝试向 GUI 添加很多 JLabel?或者您只是想显示 3 个随鼠标操作随机变化的图像?

我建议以不同的方式构建事物:

  • 如果可能,请在类的构造函数中一次读取所有必需的图像,将图像放入 ImageIcons,然后根据需要将它们添加到一个或多个 ArrayList 中。
  • 不要在每次发生鼠标点击时添加新的 JLabel。
  • 创建一个 JPanel,为其提供一个 GridLayout,并在类构造函数中向其中添加三个 JLabel,这些 JLabel 可以是实例字段,也可以是数组或 ArrayList 中的。
  • 将此 JPanel 添加到您的 JFrame。
  • 为每个 JLabel 添加一个 MouseListener
  • 在 MouseListener 的 mousePressed(MouseEvent e) 方法(而不是 mouseClicked)中,随机化您的数字并使用该数字调用 setIcon(...) JLabel 源上的 code>,通过对 MouseEvent 参数调用 getSource() 来获取。
<小时/>

例如:

import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.*;

@SuppressWarnings("serial")
public class RandomImages extends JPanel {
   private static final int LABEL_COUNT = 3;
   private Random random = new Random();

   public RandomImages() {
      setLayout(new GridLayout(1, 3));
      for (int i = 0; i < LABEL_COUNT; i++) {
         final List<Icon> iconList = new ArrayList<>();

         // TODO: get images for the ith list 
         // and fill iconList with ImageIcons from the first grouping

         // create JLabel and give it the first Icon from the List above
         final JLabel label = new JLabel(iconList.get(0));
         label.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
               // get random number from random object using iconList.size()
               // get random Icon from list
               // set label's icon via setIcon(...)
            }
         });
         // add to GUI
         add(label);
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("RandomImages");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new RandomImages());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

具体示例2:

import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class RandomChessMen extends JPanel {
   // for this example I get a sprite sheet that holds several sprite images in it
   // the images can be found here: http://stackoverflow.com/questions/19209650
   private static final String IMAGE_PATH = "/image/memI0.png";
   private static final int LABEL_COUNT = 2;
   private static final int ICON_COLUMNS = 6;
   private Random random = new Random();

   public RandomChessMen() throws IOException {
      URL url = new URL(IMAGE_PATH);
      BufferedImage largeImg = ImageIO.read(url);
      setLayout(new GridLayout(1, 0));

      // break down large image into its constituent sprites and place into ArrayList<Icon>
      int w = largeImg.getWidth() / ICON_COLUMNS;
      int h = largeImg.getHeight() / LABEL_COUNT;
      for (int i = 0; i < LABEL_COUNT; i++) {
         final List<Icon> iconList = new ArrayList<>();
         int y = (i * largeImg.getHeight()) / LABEL_COUNT;
         // get 6 icons out of large image
         for (int j = 0; j < ICON_COLUMNS; j++) {
            int x = (j * largeImg.getWidth()) / ICON_COLUMNS;
            // get subImage
            BufferedImage subImg = largeImg.getSubimage(x, y, w, h);
            // create ImageIcon and add to list
            iconList.add(new ImageIcon(subImg));
         }

         // create JLabel
         final JLabel label = new JLabel("", SwingConstants.CENTER);
         int eb = 40;
         label.setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb));

         // get random index for iconList
         int randomIndex = random.nextInt(iconList.size());
         Icon icon = iconList.get(randomIndex); // use index to get random Icon
         label.setIcon(icon); // set label's icon
         label.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
               Icon secondIcon = label.getIcon();
               // so we don't repeat icons
               while (label.getIcon() == secondIcon) {
                  int randomIndex = random.nextInt(iconList.size());
                  secondIcon = iconList.get(randomIndex);
               }
               label.setIcon(secondIcon);
            }
         });
         // add to GUI
         add(label);
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("RandomImages");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      try {
         frame.getContentPane().add(new RandomChessMen());
      } catch (IOException e) {
         e.printStackTrace();
         System.exit(-1);
      }
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

关于java - Java 中鼠标单击框架中的图像不新鲜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29975472/

相关文章:

java - 单击按钮时选择行时从多个表获取数据

Java - JFrame 上只有两个圆角

java - 如何在 FlowLayout 或 GridLayout 中手动放置组件?

java - Swing:移动JPanel

Java - 从 FXML ald Java Controller 传递变量

Java bean 测试框架

java - 如何从匿名 ActionListener 访问 JFrame 以在框架中添加面板?

java Jpanel 和边框布局,向 PAGE_END 添加 2 个组件

java - CDI - @Injected 字段为空

java - 为什么Oracle的JDBC驱动不支持Oracle的Boolean类型