突出显示用户输入标签

问题描述

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

  1. 程序正在绘制31个标签数组,其中包含从1到31的整数 (每月的几天)。
  2. 用户在文本字段中插入1到31之间的数字。如果数字大于/小于/不是数字,则程序将不执行任何操作(稍后将处理异常)。
  3. 如果用户插入数字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();
        });

    }

}

编辑:代码已修复。解决的问题

我们非常欢迎任何帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)