Java 在swing中突出显示用户输入标签

Java 在swing中突出显示用户输入标签,java,arrays,swing,user-interface,jlabel,Java,Arrays,Swing,User Interface,Jlabel,我需要你的帮助, 我目前正在开发一个使用java和swing作为GUI的小程序。逻辑如下: 程序正在绘制包含整数1到31的31个标签数组 (每月的天数) 用户从文本字段中插入一个数字,从1到31。若高于/低于/不等于数字,则程序不执行任何操作(稍后将处理异常) 如果用户插入,例如数字5,程序应该突出显示数组中的特定JLabel,并更改其背景或其他内容。突出显示用户选择的内容很重要 问题是,我无法让它只重新绘制数组中的特定标签。它总是要么重新绘制整个标签数组,要么在数组末尾添加标签,我不希望它这样

我需要你的帮助, 我目前正在开发一个使用java和swing作为GUI的小程序。逻辑如下:

  • 程序正在绘制包含整数1到31的31个标签数组 (每月的天数)
  • 用户从文本字段中插入一个数字,从1到31。若高于/低于/不等于数字,则程序不执行任何操作(稍后将处理异常)
  • 如果用户插入,例如数字5,程序应该突出显示数组中的特定JLabel,并更改其背景或其他内容。突出显示用户选择的内容很重要
  • 问题是,我无法让它只重新绘制数组中的特定标签。它总是要么重新绘制整个标签数组,要么在数组末尾添加标签,我不希望它这样做

    如何访问阵列中的特定编号并仅更改该标签

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Scanner;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.JTextField;
    import javax.swing.SpinnerDateModel;
    import javax.swing.SpinnerModel;
    import javax.swing.SwingUtilities;
    
    public class BirthDayCalendar {
        JFrame frame;
        Toolkit toolkit;
        Dimension size;
        JPanel monthJPanel, inputTestPanel;
        JLabel dayLabel;
        JLabel[] daysLabelArray;
        String[] userBDayNamesStringArray;
        int[] userBDayDaysArray; // stores the day of the BDay
        int[] userBDayIntMonthArray; // stores the month
        int[] userBDayIntYearArray; // stores the year
    
        JTextField insertNameOfBDayPerson;
        JButton addData, saveButton;
    
        int userInputNumber;
        String userDateStoredString, daysSaved, monthsSaved, yearsSaved;
    
        java.util.Date date = new Date();
        Calendar calendar1; // REQUEST SPINNERS: calendar1 --> initial JSpinner;
    
        Date userInputDate;// gets the request date value
        JSpinner requestDateSpinner;
        SpinnerModel model1; // REQUEST SPINNERS: Model 1 --> initial JSpinner;
        DateDefinition dateData = new DateDefinition();
        JSpinner.DateEditor editor;
        String format;
        Scanner in;
        
        String directory = System.getProperty("user.home");
        String fileName = "data.txt";
        String absolutePath = directory + File.separator + fileName;
        
        
        
        
        
        
        
        
    
        BirthDayCalendar() {
    
            frame = new JFrame("BirthDay Calendar");
            frame.setLayout(new FlowLayout());
    
            monthJPanel = new JPanel();
    
            // October test
            // System.out.println(dateData.currentYear + " " + dateData.monthOfOctober + " "
            // + dateData.daysInMonth); //
            // just for checking
    
            // adding the month days on the screen
    
            daysLabelArray = new JLabel[dateData.daysInMonth + 1];
            for (int i = 1; i <= dateData.daysInMonth; i++) {
                dayLabel = new JLabel(i + "");
                setLabelSizes(dayLabel);
                daysLabelArray[i] = dayLabel;
                monthJPanel.add(daysLabelArray[i]);
            }
    
            inputTestPanel = new JPanel();
    
            insertNameOfBDayPerson = new JTextField(10);
    
            userBDayDaysArray = new int[32];
            userBDayNamesStringArray = new String[32];
            userBDayIntMonthArray = new int[32];
            userBDayIntYearArray = new int[32];
    
            calendar1 = Calendar.getInstance();
            Date now = calendar1.getTime();
            calendar1.add(Calendar.YEAR, -100);
    
            Date startDate = calendar1.getTime();
            calendar1.add(Calendar.YEAR, 100);
    
            Date endDate = calendar1.getTime();
    
            model1 = new SpinnerDateModel(now, startDate, endDate, Calendar.YEAR);
    
            requestDateSpinner = new JSpinner(model1); // creating Visual Spinner
            format = "dd MMM yy"; // formatting Visual Spinner
    
            editor = new JSpinner.DateEditor(requestDateSpinner, format);
            requestDateSpinner.setEditor(editor); // applying the formatting to the visual spinner
    
            // System.out.println("DateDefinition is: " + october.monthOfOctober + " and
            // year is: " + october.currentYear);
            
            
    
        
            
            
            
            
            
            
            
            
            
            
            
    
            addData = new JButton("Register Date and Name");
            addData.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent arg0) {
    
                    addUserData();
    
                }
    
            });
    
            saveButton = new JButton("Save");
    
            saveButton.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent arg0) {
    
                    insertNameOfBDayPerson.setText("");
    
                }
    
            });
    
            inputTestPanel.add(requestDateSpinner);
            inputTestPanel.add(insertNameOfBDayPerson);
            inputTestPanel.add(addData);
            inputTestPanel.add(saveButton);
    
            setPanelSizes(monthJPanel);
            setPanelSizes(inputTestPanel);
    
            frame.add(monthJPanel);
            frame.add(inputTestPanel);
            setSize(frame);
            frame.setVisible(true);
        }
    
        void addUserData() {
    
            SimpleDateFormat formater = new SimpleDateFormat("dd MM yyyy");
            userDateStoredString = formater.format(requestDateSpinner.getValue());
            in = new Scanner(userDateStoredString);
            daysSaved = in.next();
            monthsSaved = in.next();
            yearsSaved = in.next();
            in.close();
    
            userInputNumber = Integer.parseInt(daysSaved);
    
            System.out.println("Day is: " + daysSaved);
            System.out.println("Month is: " + monthsSaved);
            System.out.println("Year is: " + yearsSaved);
    
            for (int i = 1; i <= dateData.daysInMonth; i++) {
    
                if (userInputNumber == i) {
    
                    daysLabelArray[userInputNumber]
                            .setText(userInputNumber + " " + insertNameOfBDayPerson.getText().toString());
    
                    monthJPanel.repaint();
                    monthJPanel.revalidate();
    
                    userBDayDaysArray[i] = userInputNumber; // gets the day 
                    userBDayNamesStringArray[i] = insertNameOfBDayPerson.getText().toString(); // stores the name
                    userBDayIntMonthArray[i] = Integer.parseInt(monthsSaved); // stores the month
                    userBDayIntYearArray[i] = Integer.parseInt(yearsSaved); // stores the year
    
                }
                
                // for testing purpose only         
                System.out.println("day stored: " + userBDayDaysArray[i] + " and the name is: "
                        + userBDayNamesStringArray[i] + " and the month is: " + userBDayIntMonthArray[i]
                        + " and the year is: " + userBDayIntYearArray[i]);
    
            }
            
            // System.out.println("Length of Days Label Array: " + daysLabelArray.length);
    
            
            // write content to file
            try (FileOutputStream fileOutputStream = new FileOutputStream(absolutePath)) {
                
                String fileContent = "This is a smple text";
                fileOutputStream.write(fileContent.getBytes());
                
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
            
            
            
            
        }
    
        void setSize(JFrame frame) {
            frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
            // frame.setPreferredSize(new Dimension(1000, 700));
            frame.setMinimumSize(new Dimension(1000, 700));
            toolkit = frame.getToolkit();
            size = toolkit.getScreenSize();
            frame.getContentPane().setBackground(Color.gray);
            frame.setExtendedState(frame.MAXIMIZED_BOTH);
    
            // frame.setLocation((size.width - frame.getWidth()) / 2, (size.height -
            // frame.getHeight()) / 2);
    
        }
    
        void setLabelSizes(JLabel label) {
            label.setPreferredSize(new Dimension(70, 50));
            label.setBorder(BorderFactory.createLineBorder(Color.red));
        }
    
        void setPanelSizes(JPanel panel) {
            panel.setLayout(new FlowLayout());
            panel.setPreferredSize(new Dimension(490, 350));
            panel.setMaximumSize(new Dimension(490, 350));
            panel.setMinimumSize(new Dimension(490, 350));
            panel.setBorder(BorderFactory.createLineBorder(Color.black));
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> {
                BirthDayCalendar calendar = new BirthDayCalendar();
            });
    
        }
    
    }
    
    导入java.awt.Color;
    导入java.awt.Dimension;
    导入java.awt.FlowLayout;
    导入java.awt.Toolkit;
    导入java.awt.event.ActionEvent;
    导入java.awt.event.ActionListener;
    导入java.io.File;
    导入java.io.FileNotFoundException;
    导入java.io.FileOutputStream;
    导入java.io.IOException;
    导入java.text.simpleDataFormat;
    导入java.util.Calendar;
    导入java.util.Date;
    导入java.util.Scanner;
    导入javax.swing.BorderFactory;
    导入javax.swing.JButton;
    导入javax.swing.JFrame;
    导入javax.swing.JLabel;
    导入javax.swing.JPanel;
    导入javax.swing.JSpinner;
    导入javax.swing.JTextField;
    导入javax.swing.SpinnerDateModel;
    导入javax.swing.SpinnerModel;
    导入javax.swing.SwingUtilities;
    公课生日日历{
    JFrame框架;
    工具包;
    尺寸;
    JPanel Monthj面板,inputTestPanel;
    JLabel-dayLabel;
    JLabel[]Dayslabearray;
    字符串[]userBDayNamesStringArray;
    int[]userBDayDaysArray;//存储日期
    int[]userBDayIntMonthArray;//存储月份
    int[]userbdayintyearray;//存储年份
    JTextField insertnameofDayPerson;
    JButton addData,saveButton;
    int userInputNumber;
    字符串userDateStoredString,daysSaved,MonthSaved,yearsSaved;
    java.util.Date日期=新日期();
    Calendar calendar1;//请求微调器:calendar1-->初始JSpinner;
    Date userInputDate;//获取请求日期值
    JSpinner-requestDateSpinner;
    SpinnerModel model1;//请求微调器:Model 1-->初始JSpinner;
    DateDefinition dateData=新的日期定义();
    JSpinner.DateEditor;
    字符串格式;
    扫描仪输入;
    String directory=System.getProperty(“user.home”);
    字符串fileName=“data.txt”;
    String absolutePath=目录+文件.分隔符+文件名;
    生日日历{
    框架=新的JFrame(“生日日历”);
    frame.setLayout(新的FlowLayout());
    monthJPanel=newjpanel();
    //十月测试
    //System.out.println(dateData.currentYear+“”+dateData.monthOfOctober+“”
    //+dateData.daysInMonth)//
    //只是为了检查一下
    //在屏幕上添加月份天数
    daysLabelArray=新的JLabel[dateData.daysInMonth+1];
    
    对于(int i=1;在我的机器上,一天的标签被删除。没有其他的改变外观。这与你所报告的不一致,所以我很困惑。BTW -而不是<代码> jTrutfield < /代码>,考虑使用<代码> JSpinner < /代码>。这些值永远不会超出<代码> SpinnerNumberMode指定的范围之外的任何东西。l
    (因此无需异常处理)。不要创建新组件。只需更改现有组件的属性。因此,将所有标签存储在一个数组中。然后,只需索引到数组中以获取标签,然后调用setText(…)标签上。我怎么说你的回答就是解决我问题的人?谢谢,我解决了,我会更新代码,以防有人需要类似的东西。现在它工作正常。“我怎么说你的回答就是解决我问题的人?”提示:加上@camickr(或者其他人,
    @
    很重要)通知此人新的评论。