package view; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.event.*; import util.Constant; import model.Block; /** * 自定义类 * */ //定义自定义对话框类Zidingyi,继承自JDialog,实现ActionListener接口 public class Zidingyi extends JDialog implements ActionListener{ // 创建多个面板用于不同功能设置 JPanel jp_sudu=new JPanel(); JPanel jp_rank=new JPanel(); JPanel jp_she=new JPanel(); JPanel jp_b=new JPanel(); // 创建单选按钮用于等级选择 JRadioButton jr_rank1=new JRadioButton("初级"); JRadioButton jr_rank2=new JRadioButton("中级"); JRadioButton jr_rank3=new JRadioButton("高级"); // 创建滑动条用于速度调节 JSlider jsl=new JSlider(1,10);//滑动框1-10 int newspeed;// 存储新的速度值 Block block;// 引用Block类对象,用于游戏中的方块 GameCanvas gc;// 引用GameCanvas类对象,用于游戏界面显示 ButtonGroup bg_rank=new ButtonGroup(); // 创建ButtonGroup管理单选按钮 JLabel tj_sudu=new JLabel("下落速度");// 速度标签 // 创建复选框用于附加功能开关 JCheckBox jc1=new JCheckBox("方块是否自动上涨"); JCheckBox jc2=new JCheckBox("游戏过程是否播放声音"); JCheckBox jc3=new JCheckBox("更换背景"); // 图片资源引用 ImageIcon image=new ImageIcon(Constant.backGround1); JLabel label=new JLabel(image);// 使用图片作为背景的标签 // 构造函数初始化对话框和组件 public Zidingyi(JFrame j,String s,boolean a,Block block,GameCanvas gc){ super(j,s,a); this.setBounds(0,170, 480, 350);// 设置对话框大小和位置 this.setVisible(false);// 初始时对话框不可见 this.setResizable(false);// 对话框不可调整大小 this.setLayout(null); // 使用null布局管理器 this.block=block;// 初始化Block对象引用 this.gc=gc;// 初始化GameCanvas对象引用 label.setBounds(0, 0, this.getWidth(), this.getHeight());// 设置背景图片大小与对话框一致 // 添加各个面板到对话框中 add1(); add2(); add3(); add4(); } /** * 调节速度面板 */ public void add1(){ jp_sudu.setBounds(0, 40, 500, 80);// 设置面板位置和大小 jp_sudu.add(tj_sudu); tj_sudu.setFont(new Font("华文行楷", Font.BOLD, 15));// 设置字体 jsl.setValue(11-Constant.step);// 设置滑动条初始值 newspeed=11-jsl.getValue();// 获取新的速度值 // 添加滑动条监听器以响应速度变化 jsl.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent ce) { // TODO Auto-generated method stub newspeed=11-jsl.getValue();// 更新速度值 } }); jsl.setMajorTickSpacing(9);// 设置主刻度间隔 jsl.setMinorTickSpacing(1);// 设置次刻度间隔 jsl.setPaintTicks(true);// 显示刻度标记 jsl.setPaintLabels(true);// 显示刻度标签 jp_sudu.add(jsl); // 添加速度说明标签 JLabel tj_sudu1=new JLabel("速度1到10依次加快"); tj_sudu1.setFont(new Font("华文行楷", Font.BOLD, 15)); // 添加所有组件到面板并将其添加到对话框中 jp_sudu.add(tj_sudu1); this.add(jp_sudu); } /** * 设置等级面板 */ public void add2(){ // 设置面板位置、大小和组件 JPanel jp_rank=new JPanel(); jp_rank.setBounds(90, 140, 300, 30); JLabel tj_shape=new JLabel("方块形状"); tj_shape.setFont(new Font("华文行楷", Font.BOLD, 15)); int i=Block.get_addl();// 获取当前难度级别 // 单选按钮监听器及设置 jr_rank1.addActionListener(this); jr_rank1.setActionCommand("初级"); jr_rank2.addActionListener(this); jr_rank2.setActionCommand("中级"); jr_rank3.addActionListener(this); jr_rank3.setActionCommand("高级"); // 根据当前等级预选单选按钮 if(i==7) jr_rank1.setSelected(true); else if(i==10) jr_rank2.setSelected(true); else jr_rank3.setSelected(true); bg_rank.add(jr_rank1); bg_rank.add(jr_rank2); bg_rank.add(jr_rank3); jp_rank.add(tj_shape); jp_rank.add(jr_rank1); jp_rank.add(jr_rank2); jp_rank.add(jr_rank3); // 设置单选按钮位置 jr_rank1.setBounds(0, 0, 80, 30); jr_rank2.setBounds(90, 0, 80, 30); jr_rank3.setBounds(180, 0, 80, 30); this.add(jp_rank); } /** * 附加功能面板 */ public void add3(){ JPanel jp_she=new JPanel(); // 复选框监听器及设置 jp_she.setBounds(20, 190, 400, 30); jc1.addActionListener(this); if(MyFrame.high==true) jc1.setSelected(true); else jc1.setSelected(false); jc1.setBounds(0, 0, 160, 30); jp_she.add(jc1); jc2.addActionListener(this); jp_she.add(jc2); if(MyFrame.isMusic==true) jc2.setSelected(true); else jc2.setSelected(false); if(MyFrame.changeBack==true) jc3.setSelected(true); else jc3.setSelected(false); jc3.addActionListener(this); // 添加复选框到面板 jp_she.add(jc3); this.add(jp_she); } /** * 确定,取消按钮 */ public void add4(){ JPanel jp_b=new JPanel(); jp_b.setBounds(100, 240, 300, 40); JButton jb_y=new JButton("确定"); jb_y.addActionListener(this); jp_b.add(jb_y); JButton jb_n=new JButton("取消"); jb_n.addActionListener(this); jp_b.add(jb_n); // 创建包含所有面板的容器面板,并添加到对话框中 JPanel jp_zi=new JPanel(); jp_zi.setLayout(null); jp_zi.setBounds(0, 0, this.getWidth(), this.getHeight()); jp_zi.add(jp_sudu); jp_zi.add(jp_rank); jp_zi.add(jp_she); jp_zi.add(jp_b); this.add(jp_zi); } // 实现ActionListener接口方法 @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (e.getSource() instanceof JButton) { int i=Block.get_addl(); String buttonCommand = e.getActionCommand();//获取信息 if (buttonCommand.equals("确定")) { // 处理确定按钮点击事件 String actionCommand = bg_rank.getSelection().getActionCommand(); // 根据用户选择的等级更新Block对象的等级属性 if (actionCommand.equals("初级") ) { Block.set_addl(7); } else if (actionCommand.equals("中级")) { Block.set_addl(10); } else if (actionCommand.equals("高级")) { Block.set_addl(13); } // 更新附加功能状态 if (jc1.isSelected()) { MyFrame.high=true; }else MyFrame.high=false; if (!jc2.isSelected()) { MyFrame.isMusic=false; }else MyFrame.isMusic=true; if(jc3.isSelected()){ MyFrame.changeBack=true; MyFrame.background = new ImageIcon(Constant.backGround2); MyFrame.setBackGround();} else {MyFrame.changeBack=false; MyFrame.background = new ImageIcon(Constant.backGround1); MyFrame.setBackGround();} // 更新速度值和游戏相关属性 Constant.step=newspeed; jsl.setValue(11-Constant.step); MyFrame.rank=11-Constant.step; MyFrame.jt10.setText("等级:"+MyFrame.rank); this.dispose(); } else if (buttonCommand.equals("取消")) { // 恢复原有设置并关闭对话框 Block.set_addl(i); if(i==7) jr_rank1.setSelected(true); else if(i==10) jr_rank2.setSelected(true); else jr_rank3.setSelected(true); this.dispose(); } } }}