0
좋아요,이 질문에 스택 오버 플로우가 발생했는지 물어 보았습니다. 나는 거의 모든 기사를 읽었습니다. 나는이 일을 절대적으로 받아 들일 수 없다. 나는 호텔의 가용성 캘린더 역할을하는 테이블을 만들었고, 0 개의 객실을 사용할 수있는 빨강 색 셀과 0 개의 녹색을 갖는 셀을 색칠하고 싶습니다. 나는 아무 쓸모없이 테이블 셀 렌더러를 구현하려고했습니다. 여기 내 모든 코드가있다. 내가 도대체 뭘 잘못하고있는 겁니까? String
클래스가개별 색체 JTable 셀의 내용을 기반으로 셀?
table.setDefaultRenderer(String.class, new MyCellRender());
다음 열 클래스로 사용되는 경우
package gui;
import entity.Inventory;
import entity.Room;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import tools.DateCalc;
public class Calendar extends JPanel {
String[] years = {"2013", "2014"};
JComboBox yearBox = new JComboBox(years);
String[] months = {"January", "February", "March", "April", "May", "June", "July", "August",
"September", "October", "November", "December"};
JComboBox monthBox = new JComboBox(months);
LinkedList<String> lTypes = Room.getRoomTypes();
String[] types = lTypes.toArray(new String[0]);
JComboBox typeBox = new JComboBox(types);
CalendarModel model = new CalendarModel();
JTable table = new JTable(model);
public Calendar() {
super();
yearBox.setBounds(10, 10, 100, 30);
yearBox.setSelectedIndex(0);
yearBox.addItemListener(new ComboHandler());
int selected = DateCalc.getNumMonth(DateCalc.getCurrentDate());
monthBox.setSelectedIndex(selected);
monthBox.addItemListener(new ComboHandler());
// table.setBounds(10, 150, 550, 200);
model.setMonth(Integer.parseInt((String)yearBox.getSelectedItem()), monthBox.getSelectedIndex(), 0);
typeBox.addItemListener(new ComboHandler());
add(monthBox);
add(yearBox);
add(typeBox);
table.setGridColor(Color.black);
table.setShowGrid(true);
table.setRowHeight(40);
table.setBorder(BorderFactory.createLineBorder(Color.black));
table.setDefaultRenderer(String.class, new MyCellRender());
add(table);
setSize(600, 800);
setVisible(true);
}
public static void main(String[] args) {
Calendar app = new Calendar();
}
public class ComboHandler implements ItemListener {
public void itemStateChanged(ItemEvent e) {
model.setMonth(Integer.parseInt((String)yearBox.getSelectedItem()), monthBox.getSelectedIndex(), typeBox.getSelectedIndex());
table.repaint();
}
}
public class MyCellRender extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = super.getTableCellRendererComponent(table, value,
isSelected, hasFocus,
row, column);
for (int i =0; i < 7; i++){
for (int j = 0; j < j; j++){
String positive = (String)table.getModel().getValueAt(i,j);
System.out.println(positive);
int val = positive.indexOf(" 0 ");
if (val < 0)
c.setBackground(Color.green);
else{
c.setBackground(Color.red);
}
}
}
return c;
}
}
class CalendarModel extends DefaultTableModel {
String[] days = {" Sun", " Mon", " Tue", " Wed", " Thu", " Fri", " Sat"};
int[] numDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
String[][] calendar = new String[7][7];
public CalendarModel() {
for (int i = 0; i < days.length; ++i) {
calendar[0][i] = days[i];
}
for (int i = 1; i < 7; ++i) {
for (int j = 0; j < 7; ++j) {
calendar[i][j] = " ";
}
}
}
@Override
public boolean isCellEditable(int row, int column){
return false;
}
public int getRowCount() {
return 7;
}
public int getColumnCount() {
return 7;
}
public String getValueAt(int row, int column) {
return calendar[row][column];
}
public void setValueAt(String value, int row, int column) {
calendar[row][column] = value;
}
public void setMonth(int year, int month, int flag) {
for (int i = 1; i < 7; ++i) {
for (int j = 0; j < 7; ++j) {
calendar[i][j] = " ";
}
}
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(year, month, 1);
Date date = cal.getTime();
DateFormat df = new SimpleDateFormat("MMddyyyy");
String start = df.format(date);
int offset = cal.get(java.util.Calendar.DAY_OF_WEEK)-1;
offset += 7;
int num = daysInMonth(year, month);
for (int i = 0; i < num; ++i) {
String target = DateCalc.addDay(start, i);
Inventory inventory = Inventory.fromDBObject(target);
String type = (String)typeBox.getSelectedItem();
String beds = inventory.getField(type);
calendar[offset/7][offset % 7] = " " + Integer.toString(i + 1)
+ ". " + beds;
++offset;
}
}
public boolean isLeapYear(int year) {
if (year % 4 == 0) {
return true;
}
return false;
}
public int daysInMonth(int year, int month) {
int days = numDays[month];
if (month == 1 && isLeapYear(year)) {
++days;
}
return days;
}
}
}
일부 모델 : a) 모델 구현이 유효하지 않습니다. 변경 사항이있을 때 Listener에 알려야합니다. b) 렌더러에서 인덱스 좌표계를 혼합합니다. 매개 변수로 전달 된 행/열 인덱스는 사용할 수없는 뷰 좌표입니다 모델에 액세스하려면 c) 렌더러의 루프에서 달성하고자하는 것이 무엇인지 알지 못합니다. 색상 변경의 결과는 예상치 못한 변화입니다. d) 구성 요소의 수동 크기 조정/위치 지정 절대로 절대 수행하지 마십시오. , 그것은 적절한 LayoutManager의 독점적 인 작업입니다 – kleopatra
나중에 그것을 구현해야만합니다. –