鱼C论坛

 找回密码
 立即注册
查看: 3847|回复: 4

[已解决]Java事件处理问题

[复制链接]
发表于 2017-4-22 17:18:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
跪求讲解,大神帮帮我吧。

题目的要求是:设有一组英语单词存放在一个数组中,编制一个图形界面程序浏览单词。在界面中安排一个标签显示单词,另有“上一个”、“下一个”两个按钮实现单词的前后翻动。

自己试着做了一下,但结果是错误的。新手上路,请多关照

代码如下:
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Demo {

        public static void main(String[] args) {
                Demo1 A = new Demo1();
                A.print_Demo1();

        }

}

class Demo1 extends JFrame {

        /**
         *
         */
        private static final long serialVersionUID = 1L;
        String[] Word = { "one", "two", "three", "four", "five", "six" };
        JPanel A1 = new JPanel();
        JLabel B1 = new JLabel(Word[0]);
        JButton C1 = new JButton("上一个");
        JButton C2 = new JButton("下一个");

        public void print_Demo1() {
                setTitle("单词");
                setSize(number.frame_width, number.frame_heigh);
                setResizable(false);
                setVisible(true);
                // 用于窗口的定位
                Toolkit B = getToolkit();// 工具包,抽象的类用特殊方法getToolkit()得到一个对象
                Dimension C = B.getScreenSize();// Dimension
                                                                                // 类封装单个对象中组件的宽度和高度(精确到整数)。此处为得到屏幕的宽和高并放在C中
                int width = C.width;
                int heigh = C.height;
                setLocation((width - number.frame_width) / 2,
                                (heigh - number.frame_heigh) / 2);// 定位在屏幕的中间位置
                // 窗口关闭,这是个事件
                addWindowListener(new WindowAdapter() {
                        public void windowClosing(WindowEvent e) {
                                System.exit(0);
                        }
                });
                // 添加组件
                add(A1);
                A1.add(B1);
                A1.add(C1);
                A1.add(C2);
                // 添加注册事件监听器
               
                C1.addMouseListener(new MouseAdapter() {

                        @Override
                        public void mouseClicked(MouseEvent e) {
                                if(B1.getText().equals(Word[0]))
                                JOptionPane.showMessageDialog(getContentPane(), "这是第一个单词!");
                                else{
                                        for(int i=1;i<6;i++)
                                        {
                                                if(B1.getText().equals(Word[i]));
                                                B1.setText(Word[i-1]);
                                        }
                                }
                                       
                        }
                         
                       
                });
               
                C2.addMouseListener(new MouseAdapter() {

                        @Override
                        public void mouseClicked(MouseEvent e) {
                                if(B1.getText().equals(Word[5]))
                                        JOptionPane.showMessageDialog(getContentPane(), "这是最后一个单词!");
                                else
                                {
                                        for(int i=0;i<5;i++)
                                        {

                                                if(B1.getText().equals(Word[i]));
                                                B1.setText(Word[i+1]);
                                        }
                                }
                        }
                       
                });
        }
}
         
class number {
        final static int frame_width = 400;
        final static int frame_heigh = 100;

}
最佳答案
2017-4-23 09:55:23
本帖最后由 零度非安全 于 2017-4-23 10:19 编辑

0.png

注意它提示 Dead code,意思为死代码,无意义的代码(指 i++),为什么?因为一开始 JLabel 的值恰好等于

for 循环遍历第一个数,条件成立则把它变为 Word[1],但是遇到了 break,整个 for 循环结束,当你第二次点

下一个时,for 循环从 i = 0 遍历,此时 Word[1] 不等于 Word[0],遇到 break 又结束了 for 循环,所以会出现

下一个按扭只能点一次它会变,而再点却无任何变化,把 break 语句放在 if 语句块内,当 if 条件不成立,就不会

碰到 break 从而立即结束整个循环,它会继续下一次循环继续作判断。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-22 21:27:02 | 显示全部楼层
本帖最后由 零度非安全 于 2017-4-22 21:30 编辑

我猜你的问题是点下一个直接跳 six(在 if 语句后面没有分号的情况下)。

原因:

对你代码进行分析下,if 语句为什么最后有分号,这是其一,其二,当你第一次按下一个时,此时 JLabel 中值是 Word[0]

for 循环遍历正好相等,那么接下来按下一个,又相等,又接着,继续,一直到 six,所以会出现点一次下一个直接跳到 six


我在那里加了个 break;那为什么在上面一个我没加 break 可以呢?我想把这个问题留给楼主自己去思考 ^_^!

0.png

1.png

最后我自已测试了一遍:

1.gif
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-23 08:45:30 | 显示全部楼层
零度非安全 发表于 2017-4-22 21:27
我猜你的问题是点下一个直接跳 six(在 if 语句后面没有分号的情况下)。

原因:

大神,上一个不加break已理解。刚才手癌将break添错了位置,于是就出现了无法理解的情况,按钮只能发挥一次作用,还请大神讲解一下。感谢!

代码如下:
C2.addMouseListener(new MouseAdapter() {

                        @Override
                        public void mouseClicked(MouseEvent e) {
                                if (B1.getText().equals(Word[5]))
                                        JOptionPane
                                                        .showMessageDialog(getContentPane(), "这是最后一个单词!");
                                else {
                                        for (int i = 0; i < 5; i++) {

                                                if (B1.getText().equals(Word[i]))

                                                        B1.setText(Word[i + 1]);

                                                break;

                                        }
                                }
                        }

                });

break 加错了位置此时程序是如何运行的呢?大神?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-23 09:55:23 | 显示全部楼层    本楼为最佳答案   
本帖最后由 零度非安全 于 2017-4-23 10:19 编辑

0.png

注意它提示 Dead code,意思为死代码,无意义的代码(指 i++),为什么?因为一开始 JLabel 的值恰好等于

for 循环遍历第一个数,条件成立则把它变为 Word[1],但是遇到了 break,整个 for 循环结束,当你第二次点

下一个时,for 循环从 i = 0 遍历,此时 Word[1] 不等于 Word[0],遇到 break 又结束了 for 循环,所以会出现

下一个按扭只能点一次它会变,而再点却无任何变化,把 break 语句放在 if 语句块内,当 if 条件不成立,就不会

碰到 break 从而立即结束整个循环,它会继续下一次循环继续作判断。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-4-23 10:09:45 | 显示全部楼层
零度非安全 发表于 2017-4-23 09:55
注意它提示 Dead code,意思为死代码,无意义的代码(指 i++),为什么?因为一开始 JPanel 的值恰好等 ...

感谢大神,已明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 13:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表