소스 자체가 길다보니까 최대한 핵심적인 부분만 뽑아서 복사해왔어 ㅠ 자바 잘하는 형들 좀 부탁좀할게 ㅠ
일단 지금 내가 달력에 일정넣는거러 만들고 있거든. 일단 셀을 더블클릭했을때 일정 추가창이 뜨고,
추가버튼 위쪽에 텍스트창에 글자를 치고 추가버튼을 누르면 밑에 텍스트창에 복사가 되고, 또 선택한 셀 정중앙에 글자가 나오는거야.
(셀 정중앙에 나오는 글자는 JLabel schedule 로 선언해뒀음.)
더블클릭 한 이후부터 소스코드 보여줄게
---------------Calendar Cell 클래스-----------------------
public void mouseClicked( MouseEvent e ) {
if(e.getClickCount()==2){
calendar.doubleClicked(); // 일정 관리창 추가.
}
}
우선 이게 CalendarCell 클래스의 마우스 두번눌렀을때 이벤트 핸들링임. calendar 인스턴스로 넘긴다는 뜻이거든(클래스는 CalendarPanel)
------------------CalendarPanel 클래스-------------------------
public void doubleClicked(){
recountDate();
tx=new TextWindow(this, cellSize, sDate, cDate);
System.out.println(sDate);
System.out.print(cDate);
}
이게 그 CalendarPanel 클래스의 더블클릭 메소드야. 여기서 Textwindow를 하나 만듬( 더블클릭하면 뜨는 창)
------------------------------더블클릭하면 나오는 새 창 클래스---------------------------
package cal.gui;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class TextWindow extends JFrame {
MyCenterPanel a;
Container contentPane;
TextWindow(CalendarPanel calendar, Dimension d, int sDate, int cDate) {
setTitle("일정 추가");
a= new MyCenterPanel(calendar, d, sDate, cDate);
contentPane = getContentPane();
contentPane.add(a, BorderLayout.CENTER);
setSize(300,300);
setVisible(true);
}
class MyCenterPanel extends JPanel {
CalendarPanel calendar;
Dimension d;
int sD, cD;
DaysPane dp;
JTextField tf;
JButton btn;
JTextArea ta;
public Dimension cellSize = new Dimension(20,20);
MyCenterPanel(CalendarPanel calendar, Dimension d, int sDate, int cDate) {
sD=sDate;
cD=cDate;
tf = new JTextField(20);
btn = new JButton("추가");
dp = new DaysPane(calendar, d);
// 버튼에 Action 리스너를 등록한다.
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ta.append(tf.getText()+"\n");
dp.setScheduleNum(sD, cD, tf.getText());
}
});
ta = new JTextArea(7, 20);
add(new JLabel("아래 창에 문자열을 입력하고 버튼을 클릭하세요"));
add(tf);
add(btn);
add(new JScrollPane(ta));
}
}
}
이게 좀 길다.. 설명하기가 너무 복잡한데 형들 알아서 해석 좀 부탁할게. 일단 전체적으로 J프레임에 컨텐트팬을 붙이고나서 DaysPane의 인스턴스를 생성하다음 스케쥴셋 메소드를 호출하는거임.
public void setScheduleNum(int startday, int currentday, String s) {
cells[(startday-2)+currentday].setScheduleNum(s);
System.out.println(s);
}
이게 호출된 DaysPane의 스케쥴 셋 메소드거든.. 여기서 cells 배열은 CalendarCell(실질적인 달력의 6x7 셀임.)의 메소드를 호출하는거임.
println은 내가 정상적으로 값이 나오나 안나오나 시험해본건데 정상적으로 값은 나왔어 ㅇㅇ. 텍스트창에 문자 입력하면 그대로 콘솔에 떴음.
public void setScheduleNum(String s){
schedule.setText(s); // JLabel schedule
System.out.println(s);
repaint();
그리고 마지막으로 CalendarCell 클래스의 스케쥴 셋 메소드야...
여기서도 println에서는 제대로 값이 출력됐는데... setText메소드를 써서 대입을 했는데 셀에는 아무것도 안나타나더라 ㅠㅠ
이게 내 생각보다 좀 총체적인 문제일수도 있는데
혹시 형들 눈에 좀 뭐가 걸린다 싶으면 답변좀 부탁할게.... 진짜 머리 빠개지는거 같다.. 이거때문에 몇시간을 고민하는건지 ㅠ
오픈소스 받아서 수정하는게 이리 힘들줄이야...
ㅅㅂㅋㅋㅋㅋ 답변해줄라고 들어왔는데 질문이 너무길다
미치겠다 나도 ㅠㅠㅠ
schedule을 cell에 add 했음?
마지막 메소드에서setText메소드가 인자로 받은 string 값을 label에 쓰는거임.. 즉 label은 셀에 이미 달려있으니 셀에 써진거지
캬.... 모델과 뷰가 얽혀있어서 브레이크 포인트 찍어놓고 실행해보지 않으면 기능 수정하고 넣는게 겁나게 힘들거다. 보통은 클래스다이어그램, 시퀀스 다이어그램으로 정적 동적 상태를 봐야 하는데 위 코드 설명으로는 뭐라 말하기가 애매하다. 말 그대로 총체적 난국이고, 간단한 조언 정도로는 해결이 힘듬.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ고맙다
안좋은 부분은 CalendarPanel 에 대한 참조가 수많은 ui 컴포넌트들의 생성자를 통해서 여기저기 공유되고 있다는거.... 왜 코드가 이렇게 된건지는 알겠는데 가장 큰이유는 위코드에서 각각의 스케쥴을 등록 삭제해주는 클래스(모델)가 없다는거... 그러다보니 이 기능이 지금 어딘지 모를 ui클래스에 흩뿌려져있고, 이 기능들을 쓰려다보니.....
..... ui클래스에 대한 참조가 여기저기 막 뿌려지고 복잡도가 증가함. 코드는 어느정도 짤줄 아는것같으니까 디자인 패턴을 적용해서 복잡도를 낮춰야 함.
ㅋㅋㅋㅋ나도 지금 왜 잘못된건지는 알겠는데 도저히 못고치겠다. 하.. 셀에다가 일정 박는거 하나만 되면 진짜 만사오케인데 이게뭐냐 ㅠ
내가 자바배운지 두달밖에 안됐고 그마저도 다른 전공공부 하느라 자바에 집중을 못해 ㅠㅠ 디자인패턴 공부할 시간이 없다 지금 프로젝트가 여기저기서 폭발해서 아휴..
클래스가 n개일때의 복잡도가 N이라고 하면 클래스가 2n 개로 늘었을때 복잡도는 2N가 아니라 최소N^2배로 증가한다. 복잡도 앞에는 장사 없다. 서울대 나온 놈이든 고졸 중퇴한 놈이든 다 나가 떨어짐. 괜히 디자인패턴을 익히는게 아님.
label이 셀에 달려 있는지 확실히 확인해보라고, 지금 보여준 코드만으로는 schedule은 CalendarCell의 필드라는 것만 알지 그게 this.add(schedule);에 의해서 추가되었는지는 확인할 수 없으니까
확실히 달려있어. 지금 내가 구현한거처럼 일정 적어서 셀에 글자 다는거 말고도, schedule 자체를 초기화시키는 메소드(즉 모든 셀의 schedule 레이블에 string 값을 넣는것)에다가 스트링값 넣어보니까 제대로 나오더라.
허허 여튼 그럼 저거 클래스 설계 다시하는게 편하겠지? 일단 내가 직접 짠건 새창 띄우는거랑 거기에 맞게 다른클래스들 약간 변형준건데..
schedule.setText(s);를 Component comps[] = this.getComponents(); for(int i=0 ; i<comps.length; i++) { if( comps[i] instanceof JLabel) comps[i].setText(s);로 바꿔봐요
안되네요잉 ㅎㅎㅠ
먼 다들 헛소리를 하노 uiupdate 해라 이기야
ui업데이트라니 먼말이야