当前位置: 首页 > 知识库问答 >
问题:

随机化JLabel的另一种解决方案

潘高洁
2023-03-14

不管怎样,这里是我正在做什么的源代码,因为我还没有任何解决我的第一个问题的方法

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import java.awt.Font;
import java.util.Random;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class Test123 {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Test123 window = new Test123();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Test123() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    
    Random generator = new Random();
    int num;
    num = generator.nextInt(9) + 1;
    int count = 0;
    
    frame = new JFrame();
    frame.setBounds(100, 100, 405, 195);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);
    
    JLabel NO1 = new JLabel("1");
    NO1.setBounds(20, -26, 43, 183);
    NO1.setFont(new Font("Arial", Font.BOLD, 75));
    frame.getContentPane().add(NO1);
    
    JLabel NO2 = new JLabel("2");
    NO2.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
    NO2.setFont(new Font("Arial", Font.BOLD, 75));
    NO2.setBounds(60, -26, 43, 183);
    frame.getContentPane().add(NO2);
    
    JLabel NO3 = new JLabel("3");
    NO3.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
    NO3.setFont(new Font("Arial", Font.BOLD, 75));
    NO3.setBounds(102, -26, 43, 183);
    frame.getContentPane().add(NO3);
    
    JLabel NO4 = new JLabel("4");
    NO4.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
    NO4.setFont(new Font("Arial", Font.BOLD, 75));
    NO4.setBounds(143, -26, 43, 183);
    frame.getContentPane().add(NO4);
    
    JLabel NO5 = new JLabel("5");
    NO5.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
    NO5.setFont(new Font("Arial", Font.BOLD, 75));
    NO5.setBounds(184, -26, 43, 183);
    frame.getContentPane().add(NO5);
    
    JLabel NO6 = new JLabel("6");
    NO6.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
    NO6.setFont(new Font("Arial", Font.BOLD, 75));
    NO6.setBounds(223, -26, 43, 183);
    frame.getContentPane().add(NO6);
    
    JLabel NO7 = new JLabel("7");
    NO7.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
    NO7.setFont(new Font("Arial", Font.BOLD, 75));
    NO7.setBounds(264, -26, 43, 183);
    frame.getContentPane().add(NO7);
    
    JLabel NO8 = new JLabel("8");
    NO8.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
    NO8.setFont(new Font("Arial", Font.BOLD, 75));
    NO8.setBounds(304, -26, 43, 183);
    frame.getContentPane().add(NO8);
    
    JLabel NO9 = new JLabel("9");
    NO9.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    });
    NO9.setFont(new Font("Arial", Font.BOLD, 75));
    NO9.setBounds(345, -26, 43, 183);
    frame.getContentPane().add(NO9);
    
    JLabel CorrectAns = new JLabel("Correct!");
    CorrectAns.setEnabled(false);
    CorrectAns.setBounds(181, 132, 46, 14);
    frame.getContentPane().add(CorrectAns);
    
    NO1.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            if (e.getSource() == num) {
                count++;
                CorrectAns.setText("Correct!" + count + " attempts");
            }
        }
    });
}
}

共有1个答案

华化
2023-03-14

MouseEvent#GetSource将返回触发事件的对象,在您的示例中是JLabel

“通常”更好的解决方案可能是使用JButton,然后利用ActionListener。我会将一个ActionListener附加到“correct”按钮以处理正确的工作流,并将一个ActionListener附加到其他按钮以处理不正确的状态

有关详细信息,请参阅如何使用按钮、复选框和单选按钮以及如何编写操作侦听器

import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

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

    public Twst() {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new GridBagLayout());
            randomButtons();
        }

        protected void randomButtons() {
            removeAll();
            List<JButton> buttons = new ArrayList<>(4);
            Random rnd = new Random();
            Set<Integer> numbers = new HashSet<>();
            while (numbers.size() < 4) {
                int number = rnd.nextInt(99) + 1;
                numbers.add(number);
            }

            for (Integer number : numbers) {
                JButton btn = new JButton(Integer.toString(number));
                add(btn);
                buttons.add(btn);
            }

            Collections.shuffle(buttons);
            JButton correct = buttons.remove(0);
            correct.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent evt) {
                    JOptionPane.showMessageDialog(TestPane.this, "Correct");
                    randomButtons();
                }
            });

            ActionListener wrong = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent evt) {
                    if (evt.getSource() instanceof JButton) {
                        JButton btn = (JButton) evt.getSource();
                        btn.setEnabled(false);
                    }
                    JOptionPane.showMessageDialog(TestPane.this, "Wrong");
                    // You could keep a counter or do what ever else you
                    // want with a wrong guess
                }
            };
            for (JButton btn : buttons) {
                btn.addActionListener(wrong);
            }
            revalidate();
            repaint();
        }

    }
}
 类似资料:
  • 问题内容: 是否可以在另一个JLabel上添加一个JLabel?谢谢。 问题答案: 简短的回答是肯定的,一个是一个,所以它可以接受(A 是的子类)添加到使用方法: 在以上代码中,将添加到中。 但是,从视觉上看,显示了带有文本“ Hello”的标签,因此无法真正看到包含在标签中的标签。 因此,问题就来了,一个人到底想通过在另一个标签之上添加一个标签来完成什么工作。 编辑: 从评论: 好吧,我想做的是

  • (同样在将来,我想清除标签并添加一个新的图像,我还没有在这一点上,因为我不能通过这个错误,但如果上下文有助于解决方案,那么上下文)

  • 当你将本章节的程序运行了几遍后,你就会发现,我们所得到的随机数值都是一样的。很明显,他们不是所谓的随机出现的。 伪随机数出现的特性之一是如果一连串随机数出现的起始点一样,则这一串数字始终是一样的。随机数出现的起始点称作种子。每次运行C++程序时,它默认将随机数种子保持一致。 当你调试程序时,产生相同的序列对你是非常有用的。当你修改程序时,就可以有一个更好的比对。 如果你想换一组随机数,可以使用sr

  • 要求是这样的:在公共的 TS 文件中定义一个接口获取列表数据的方法,并且封装一个函数返回上个方法中返回的列表数据并导出, 在组件中通过 import 直接引入这个数据来展示,同时在不同组件中引入这个数据的请求都要重新发起。类似下面 实际的 useList 实现如下 但是我有下面一些问题: 我在 useList 中使用 computed 来返回数据,但是有缓存,在不同组件中引入的时候会有缓存。 如果

  • 本文向大家介绍Java获取随机数的3种方法,包括了Java获取随机数的3种方法的使用技巧和注意事项,需要的朋友参考一下 主要介绍了Java获取随机数的3种方法,主要利用random()函数来实现 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1))例: 从1到10的int型随数 方法2 获得随机数 通过java.Math包的random方法得到1-10的int随机数

  • 问题内容: 我一直在尝试为我的Roguelike游戏添加一个JLabel。不幸的是,它似乎不起作用。到目前为止,这是我的代码: 我已经阅读了一些其他问题的解决方案,并且只需将JLabel添加到另一个解决方案中就可以完成。它不按这里的预期工作,为什么? PS:我不想为我的JPanel使用JLayeredPane。 问题答案: 不要使用组件(即JLabels)创建游戏环境。相反,您可以绘制所有游戏对象