2016-06-26 3 views
0

스윙을 사용하여 간단한 캘린더를 만들었습니다. 프레임 내부에 두 개의 패널을 사용했습니다. 패널에는 null 레이아웃과 프레임도 있습니다. 프로그램은 정상적으로 실행되지만 내용은 표시되지 않습니다. 내가 창을 최대화하거나 최소화하거나 창 크기를 조정할 때까지. 창JPanel 프로그램이 실행될 때 내용이 나타나지 않습니다.

Before resizing the window

크기를 조정하기 전에

:

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(); 

} 

}

For better understanding click here to get the jar format of the program.

스크린 샷 : 여기

내 코드입니다

0 창

enter image description here

+0

전화를

를'는, setVisible . 또는 호출 revalidate 및 repaint 메서드 –

+0

@FastSnail setVisible (true)를 시도했지만 작동하지 않습니다. 'revalidate 및 repaint'에 대한 생각이 없습니다. setVisible 메서드와 비슷합니까 ?? – SHB

+1

고마워 이제 작동합니다. 첫 번째 패널에 'revalidate'를 추가하고 두 번째 패널에 'repaint'를 추가하십시오. – SHB

답변

1

내 자신의 질문에 대답 :; 모든 구성 요소를 추가 한 후`(참) ... 1 패널의 '재 검증'과 지금 작동하는 2 패널의 '다시 그리기'를 추가 한 후

-1

크기를 조정 한 후에 당신은 빠른 달팽이 언급처럼, 당신의 구성 요소에 setVisible(true) 전화를 잊어 버렸습니다. 또한 JPanel의 repaint 메서드를 호출해야합니다.

+0

고마워 .. 이제 작동합니다. 첫 번째 패널에 'revalidate'를 추가하고 두 번째 패널에 'repaint'를 추가 한 후. – SHB

관련 문제