a2227980358 2023-04-02 23:19 采纳率: 100%
浏览 68
已结题

java日历问题无法解决 swing 下拉框问题

//这是主Second文件
package yan;


import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import yan1.YearMonth;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.time.DayOfWeek;
import java.time.LocalDate;







public  class Second extends JFrame implements ActionListener{ 
        int year=2023;
        int month=4; 
        private int y=0; 
        private int x=0;
        private int n=0;
        private static int monthday;
        private int dayofweek;//
         JComboBox jComboBox_1=new JComboBox();
         JComboBox jComboBox_2=new JComboBox();
        Font an=new Font("华文楷体",Font.BOLD,25);
        
        
    public void Sec() {//建造窗体
        
        
        
        
        draw();
        year();
        month();
        weekword();
        getyearmonth();
        getweekday(); 
        function();
        
        
        
    }
    public void draw() { //建造界面和标题
        
        this.setLayout(null);
        setTitle("2022141461175_夏弋昕");
        setSize(800,800);
        setLocation(200, 100);
        
    }
    
    
    
   public void year() {//写出年
      
       for(int i=0;i<11;i++) {
       jComboBox_1.addItem(i+2013);
       jComboBox_1.setFont(an);
          
       }
       jComboBox_1.setBounds(100,10,100,70);
       jComboBox_1.setMaximumRowCount(4);
       this.add(jComboBox_1);
       
   }
    public void month() {//写出月
        for(int i=0;i<12;i++) {
        jComboBox_2.addItem(i+1);
        jComboBox_2.setFont(an);
        }
        
        jComboBox_2.setBounds(400,10,100,70);
        jComboBox_2.setMaximumRowCount(4);
        this.add(jComboBox_2);
    }
    public void weekword() {//写其他文字
        JLabel jLabel_1=new JLabel("年:");
        jLabel_1.setForeground(Color.blue);//设置文字1的颜色 setForeground
        jLabel_1.setFont(an);//设置文字1的字体   setFont
        jLabel_1.setBounds(10,10,100,100);//设置文字1的距离
        JLabel jLabel_2=new JLabel("月:");
        jLabel_2.setForeground(Color.blue);//设置文字1的颜色 setForeground
        jLabel_2.setFont(an);//设置文字1的字体   setFont
        jLabel_2.setBounds(300,10,400,100);//设置文字1的距离
        JLabel jLabel_3=new JLabel("  一    二   三    四    五    六    日");
        jLabel_3.setFont(an);
        jLabel_3.setBounds(30, 70, 700, 60);
        this.add(jLabel_1);
        this.add(jLabel_2);
        this.add(jLabel_3);
        
    }
    public void function() {//算日历
        
        getyearmonth();
        this.setLayout(null);
        for(int i=0;i<42;i++){
            x+=50;
            if(i>=dayofweek-1&&n<monthday) {    n++;
            JLabel jLabel_i=new JLabel(" "+n);
            jLabel_i.setBounds(x,100+y,100,100);
            
             this.add(jLabel_i);
             jLabel_i.setFont(an);
             setVisible(true);    


            }
             if((i+1)%7==0) {
                 y+=100;
                 x=0;
             }
             setVisible(true);    
        }
        
        YearMonth yearmonth= new YearMonth(year,month,dayofweek,monthday);
        
    }
    public void getyearmonth() {//得到下拉框中的值
         
        
          year= Integer.parseInt(jComboBox_1.getSelectedItem().toString());
         
              
             month=Integer.parseInt(jComboBox_2.getSelectedItem().toString());
         
         
           YearMonth yearmonth= new YearMonth(year,month,dayofweek,monthday);
        
    }
    public int mont(int a) {//计算月份天数
        int days = 0;
        switch(a) {
          case 1:days=31;break;
          case 2:days=28;break;
          case 3:days=31;break;
          case 4:days=30;break;
          case 5:days=31;break;
          case 6:days=30;break;
          case 7:days=31;break;
          case 8:days=31;break;
          case 9:days=30;break;
          case 10:days=31;break;
          case 11:days=30;break;
          case 12:days=31;break;
          }
            return days;

        }
       public void change() {//改变
           
           jComboBox_1.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                // TODO 自动生成的方法存根
                if(e.getStateChange()==ItemEvent.SELECTED) {

                    function();
                    
                }
            }
               
               
           });
          
       }
         public void getweekday() {
           
            LocalDate date=LocalDate.of(year,month, 1);
           DayOfWeek weekday=date.getDayOfWeek();
           dayofweek=weekday.getValue();
            monthday=mont(month);
          
           
         }
    public void clear() {
        this.removeAll();
        this.repaint();
    }
    
    
    public static void main(String[] args) {
        
         Second two=new Second();
         
         two.Sec();
         two.change();
         System.out.println(monthday);
        
         
         
    }
    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO 自动生成的方法存根
        
    }
//这是封装文件
package yan1;

public class YearMonth {
     private int year;
     private int month;
     private int monthday;
     private int dayofweek;
     public YearMonth (){ 
     }
   
     
     
     
     
     public YearMonth (int year, int month,int dayofweek, int monthday){ 
         this.dayofweek=dayofweek;
         this.monthday=monthday;
         this.year=year;
         this.month=month;
     }
     public int getyear() {
         
         return year;
     }
     public void setyear(int year) {
         this.year=year;
     }
     public int getmonth() {
         
         return month;
     }
     public void setmonth(int month) {
         this.month=month;
     }
public int getdayofweek() {
         
         return dayofweek;
     }
     public void setdayofweek(int dayofweek) {
         this.dayofweek=dayofweek;
     }
     public int getmonthday() {
         
         return monthday;
     }
     public void setmonthday(int monthday) {
         this.monthday=monthday;
     }
     
     
     
     
     
     
     
     
}







想要实现下拉框选择的同时显示月份日历

img

img


但是只有最初的2013年1月的日历
再选择年份没用
新学java
如何解决

  • 写回答

5条回答 默认 最新

  • 阳光宅男xxb 2023-04-03 07:12
    关注

    说明年份的下拉框没有出发相应的事件。已帮您解决:
    修改后的代码:
    增加一个全局的dayLabels数组,用于存储日期

       private List<JLabel>  dayLabels = new ArrayList<>();
    
    
    

    修改建造窗体,之前的调用存在多次调用,去掉了一些不必要的调用:

    
     public void Sec() {//建造窗体
            
            
            
            
            draw();
            year();
            month();
            weekword();
     
           
            function();
            
            
            
        }
    
    

    修改了算日历的函数,这里主要是x和y、n每次要重新初始化为0,其次要把上次的日期从界面删除掉:

     public void function() {//算日历
            
            getyearmonth();
            getweekday(); 
            for(int i =0;i<dayLabels.size();i++) {
                this.remove(dayLabels.get(i));
            }
            dayLabels.clear();
            n = 0;
            x = 0;
            y = 0;
       
            for(int i=0;i<42;i++){
                x+=50;
                if(i>=dayofweek-1&&n<monthday) {  
                    n++;
                JLabel jLabel_i=new JLabel(" "+n);
                jLabel_i.setBounds(x,100+y,100,100);
             
                 this.add(jLabel_i);
                 jLabel_i.setFont(an);
                 setVisible(true);    
                 dayLabels.add(jLabel_i);
    
                }
                 if((i+1)%7==0) {
                     y+=100;
                     x=0;
                 }
                 setVisible(true);    
            }
           
            
    //        YearMonth yearmonth= new YearMonth(year,month,dayofweek,monthday);
            
        }
    
    

    修改下拉框的监听事件,增加月份的下拉监听:

     public void change() {//改变
               
               jComboBox_1.addItemListener(new ItemListener() {
    
                @Override
                public void itemStateChanged(ItemEvent e) {
                    // TODO 自动生成的方法存根
                    if(e.getStateChange()==ItemEvent.SELECTED) {
                        
                        function();
                        
                    }
                }
                   
                   
               });
               jComboBox_2.addItemListener(new ItemListener() {
    
                   @Override
                   public void itemStateChanged(ItemEvent e) {
                       // TODO 自动生成的方法存根
                       if(e.getStateChange()==ItemEvent.SELECTED) {
                       
                           function();
                           
                       }
                   }
                      
                      
                  });
              
           }
    
    

    最后的效果:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 创建了问题 4月2日

悬赏问题

  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)