[英]JPanel Contents doesn't appear when the program runs
我使用swing创建了一个简单的日历。我在框架内使用了两个面板。两个面板的布局均为空,框架也都为零。程序运行良好,但在我最大化或最小化窗口或调整窗口大小之前,不会显示任何内容。
这是我的代码:
import java.awt.Color;
import java.time.DayOfWeek;
import java.time.LocalDate;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class CalendarTest {
JFrame f;
JLabel monthYearLbl;
JLabel[] dayLbl,dateLbl;
JPanel monthAndYear,dayAndDate;
LocalDate ld;
String month,year,day;
//constructor
public CalendarTest(){
f = new JFrame("Calender");
f.setSize(365,250);
f.setLayout(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public void showMonthAndYear(){
monthAndYear = new JPanel();
monthAndYear.setBounds(0,0,350,25);
f.add(monthAndYear);
monthAndYear.setBackground(Color.MAGENTA);
ld = LocalDate.now();
month = String.valueOf(ld.getMonth());
year = String.valueOf(ld.getYear());
monthYearLbl = new JLabel(month+"-"+year);
monthAndYear.add(monthYearLbl);
}
public void showDayAndDate(){
dayAndDate = new JPanel();
dayAndDate.setLayout(null);
dayAndDate.setBounds(0,27,350,185);
f.add(dayAndDate);
dayAndDate.setBackground(Color.cyan);
//getting the first day name of the current month
DayOfWeek dow = LocalDate.of(ld.getYear(),ld.getMonth(),1).getDayOfWeek();
int lengthOfMonth = LocalDate.of(ld.getYear(),ld.getMonth(),1).lengthOfMonth();
int friday=0;
dayLbl = new JLabel[8];
int xCord = 10;
for(int i=0;i<7;i++){
String s = String.valueOf(dow);//converting dow object to string
String formatedDay = String.format("%.3s",s);//formating day in short form
if(formatedDay== "FRI"){
friday = i;
}
dayLbl[i] = new JLabel(formatedDay);//creating jlabel
dow = dow.plus(1);//incrementing day name
dayLbl[i].setBounds(xCord,10,30,20);
dayAndDate.add(dayLbl[i]);
xCord = xCord+50;//dynamic positioning of day name
}
dateLbl = new JLabel[35];
int index = 1,ycord=35;
//loop for showing the date from 1 to endofmonth
for(int i=1;i<=5;i++){
int xcord = 15;
for(int j=0;j<7;j++){
dateLbl[index] = new JLabel(String.valueOf(index));
dateLbl[index].setBounds(xcord,ycord,20,20);
if(j==friday){
dateLbl[index].setBackground(Color.black);//indicating holiday
}
dayAndDate.add(dateLbl[index]);
xcord = xcord+50;
if(index==lengthOfMonth){
break;
}
index++;
f.add(dayAndDate);
}
ycord = ycord+25;
}
}
public static void main(String[] args) {
CalendarTest calendar = new CalendarTest();
calendar.showMonthAndYear();
calendar.showDayAndDate();
}
}
屏幕截图:
调整窗口大小之前
调整窗口大小后
回答我自己的问题:
在第一个面板上添加“ revalidate”并在第二个面板上添加“ repaint”后,它现在可以工作了。
您忘记了在组件上调用setVisible(true)
,就像提到的Fast Snail。 您还应该调用JPanel的repaint方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.