问题描述
我需要你的帮助, 我目前正在使用Java和swing作为GUI的小型程序。逻辑如下:
- 程序正在绘制31个标签数组,其中包含从1到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();
});
}
}
编辑:代码已修复。解决的问题
我们非常欢迎任何帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)