基于Java事件監(jiān)聽(tīng)編寫(xiě)一個(gè)中秋猜燈謎小游戲
何為事件監(jiān)聽(tīng)
在Java中,事件監(jiān)聽(tīng)(Event Listening)是一種處理用戶(hù)交互的機(jī)制。通過(guò)事件監(jiān)聽(tīng),你的程序可以在用戶(hù)進(jìn)行某些操作(如點(diǎn)擊按鈕、輸入文本、移動(dòng)鼠標(biāo)等)時(shí)執(zhí)行特定的任務(wù)。
事件監(jiān)聽(tīng)通常涉及三個(gè)組成部分:
- 事件源:這是產(chǎn)生事件的組件。例如,一個(gè)按鈕、一個(gè)文本框、一個(gè)菜單等都可以是事件源。
- 事件:這是用戶(hù)與事件源交互的動(dòng)作。例如,點(diǎn)擊、鍵入、鼠標(biāo)移動(dòng)等。每個(gè)事件類(lèi)型都有一個(gè)對(duì)應(yīng)的Java類(lèi),例如
ActionEvent、KeyEvent等。 - 事件監(jiān)聽(tīng)器:這是一個(gè)特殊的類(lèi),用于處理事件。你需要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)了特定事件監(jiān)聽(tīng)器接口的類(lèi),并覆蓋其中的方法以定義當(dāng)事件發(fā)生時(shí)要執(zhí)行的操作。例如,如果你想要在用戶(hù)點(diǎn)擊按鈕時(shí)顯示一條消息,你可以創(chuàng)建一個(gè)實(shí)現(xiàn)
ActionListener接口的類(lèi),并在actionPerformed方法中顯示消息。
事件監(jiān)聽(tīng)的工作原理是:你將事件監(jiān)聽(tīng)器注冊(cè)到事件源上,當(dāng)用戶(hù)與事件源交互時(shí),Java運(yùn)行環(huán)境會(huì)自動(dòng)調(diào)用相應(yīng)的事件監(jiān)聽(tīng)器處理事件。
當(dāng)然了,以上是官方的一些概念,一如既往地晦澀難懂,簡(jiǎn)單點(diǎn)說(shuō),就是你在點(diǎn)擊窗口中的一些操作按鈕時(shí),Java程序是如何知道你點(diǎn)擊了它們呢?其中就用到了一些回調(diào)方法,當(dāng)你點(diǎn)擊按鈕的時(shí)候,便會(huì)調(diào)用這些回調(diào)方法,此時(shí)Java程序便知道你點(diǎn)擊了某個(gè)按鈕,接下來(lái)就可以進(jìn)行程序的下一步操作。
比如下面的一個(gè)程序:
public class Example {
public static void main(String[] args) {
JFrame frame = new JFrame("事件監(jiān)聽(tīng)");
frame.setLocationRelativeTo(null);
JButton button = new JButton("點(diǎn)我試試!");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "你真點(diǎn)啊");
}
});
frame.getContentPane().add(button);
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}在這個(gè)程序中,我們創(chuàng)建了一個(gè)窗口,并在窗口中添加了一個(gè)按鈕,此時(shí)通過(guò)調(diào)用addActionListener給按鈕添加了一個(gè)點(diǎn)擊事件,其中有回調(diào)方法actionPerformed,當(dāng)點(diǎn)擊按鈕時(shí)便會(huì)調(diào)用它,我們來(lái)試一試:

現(xiàn)在點(diǎn)擊它:

這樣一個(gè)點(diǎn)擊事件的監(jiān)聽(tīng)就完成了。
具體的執(zhí)行流程如下圖:

動(dòng)手實(shí)現(xiàn)一個(gè)猜燈謎小游戲
現(xiàn)在我們就可以用所學(xué)知識(shí)做一個(gè)簡(jiǎn)單的猜燈謎小游戲了,首先我們?cè)O(shè)計(jì)一下窗體:

我們可以做的簡(jiǎn)單點(diǎn),將題目顯示在出題框里,然后點(diǎn)擊提交按鈕提交答案,此時(shí)彈出輸入框,下一題可以切換題目,先把窗體畫(huà)出來(lái):
public LanternRiddlesGame() {
super("猜燈謎小游戲");
// 創(chuàng)建標(biāo)簽和按鈕
riddleLabel = new JLabel(riddles[currentRiddleIndex]);
submitButton = new JButton("提交");
nextButton = new JButton("下一題");
// 添加按鈕監(jiān)聽(tīng)器
submitButton.addActionListener(this);
nextButton.addActionListener(this);
// 設(shè)置布局和組件位置大小
setLayout(new FlowLayout());
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
add(riddleLabel);
add(submitButton);
add(nextButton);
setVisible(true);
}那么接下來(lái)的步驟就非常簡(jiǎn)單了,對(duì)里面的控件進(jìn)行事件的監(jiān)聽(tīng):
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == submitButton) {
// 處理提交答案邏輯
String userAnswer = JOptionPane.showInputDialog("請(qǐng)輸入你的答案:");
if (userAnswer.equalsIgnoreCase(answers[currentRiddleIndex])) {
JOptionPane.showMessageDialog(this, "回答正確!");
} else {
JOptionPane.showMessageDialog(this, "回答錯(cuò)誤!");
}
} else if (e.getSource() == nextButton) {
// 處理下一題邏輯
currentRiddleIndex++;
if (currentRiddleIndex < riddles.length) {
riddleLabel.setText(riddles[currentRiddleIndex]);
} else {
JOptionPane.showMessageDialog(this, "已經(jīng)沒(méi)有更多題目了!");
}
}
}然后準(zhǔn)備一下燈謎的素材,最后代碼如下:
public class LanternRiddlesGame extends JFrame implements ActionListener {
private JLabel riddleLabel;
private JButton submitButton;
private JButton nextButton;
private String[] riddles = {
"鐵公雞一毛不拔",
"頭上有青天",
"紙上談兵"
};
private String[] answers = { "一絲不茍", "高瞻遠(yuǎn)矚", "言之無(wú)物" };
private int currentRiddleIndex = 0;
public LanternRiddlesGame() {
super("猜燈謎小游戲");
// 創(chuàng)建標(biāo)簽和按鈕
riddleLabel = new JLabel(riddles[currentRiddleIndex]);
submitButton = new JButton("提交");
nextButton = new JButton("下一題");
// 添加按鈕監(jiān)聽(tīng)器
submitButton.addActionListener(this);
nextButton.addActionListener(this);
// 設(shè)置布局和組件位置大小
setLayout(new FlowLayout());
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null); // 居中顯示
add(riddleLabel);
add(submitButton);
add(nextButton);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == submitButton) {
// 處理提交答案邏輯
String userAnswer = JOptionPane.showInputDialog("請(qǐng)輸入你的答案:");
if (userAnswer.equalsIgnoreCase(answers[currentRiddleIndex])) {
JOptionPane.showMessageDialog(this, "回答正確!");
} else {
JOptionPane.showMessageDialog(this, "回答錯(cuò)誤!");
}
} else if (e.getSource() == nextButton) {
// 處理下一題邏輯
currentRiddleIndex++;
if (currentRiddleIndex < riddles.length) {
riddleLabel.setText(riddles[currentRiddleIndex]);
} else {
JOptionPane.showMessageDialog(this, "已經(jīng)沒(méi)有更多題目了!");
}
}
}
public static void main(String[] args) {
new LanternRiddlesGame();
}
}來(lái)看看效果:

點(diǎn)擊提交按鈕進(jìn)行答題:

此時(shí)回答正確:

點(diǎn)擊下一題可以切換題目,這樣一個(gè)簡(jiǎn)單的猜燈謎小游戲就制作完成了。
馬上也要到中秋和國(guó)慶的日子了,在這里也提前祝各位讀者朋友中秋節(jié)快樂(lè)!
以上就是基于Java事件監(jiān)聽(tīng)編寫(xiě)一個(gè)中秋猜燈謎小游戲的詳細(xì)內(nèi)容,更多關(guān)于Java編寫(xiě)中秋猜燈謎的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java自己手動(dòng)控制kafka的offset操作
這篇文章主要介紹了java自己手動(dòng)控制kafka的offset操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
list,set,map,數(shù)組之間的相互轉(zhuǎn)換詳細(xì)解析
以下是對(duì)Java中l(wèi)ist,set,map,數(shù)組之間的相互轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09
詳解java如何處理各種批量數(shù)據(jù)入庫(kù)
這篇文章主要為大家詳細(xì)介紹了java如何使用BlockingQueue處理各種批量數(shù)據(jù)入庫(kù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
Java字符串駝峰與下?lián)Q線(xiàn)格式轉(zhuǎn)換如何實(shí)現(xiàn)
這篇文章主要介紹了Java字符串駝峰與下?lián)Q線(xiàn)格式轉(zhuǎn)換如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Java中拷貝list數(shù)組幾種常見(jiàn)的方法
這篇文章主要給大家介紹了關(guān)于Java中拷貝list數(shù)組幾種常見(jiàn)的方法,在Java中,List是一個(gè)接口,它有多個(gè)實(shí)現(xiàn)類(lèi),如ArrayList、LinkedList等,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08

