Java 在swing中突出显示用户输入标签
我需要你的帮助, 我目前正在开发一个使用java和swing作为GUI的小程序。逻辑如下:Java 在swing中突出显示用户输入标签,java,arrays,swing,user-interface,jlabel,Java,Arrays,Swing,User Interface,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(或者其他人,@
很重要)通知此人新的评论。