2013-04-16 2 views
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; 
     } 
    } 
} 
+1

일부 모델 : a) 모델 구현이 유효하지 않습니다. 변경 사항이있을 때 Listener에 알려야합니다. b) 렌더러에서 인덱스 좌표계를 혼합합니다. 매개 변수로 전달 된 행/열 인덱스는 사용할 수없는 뷰 좌표입니다 모델에 액세스하려면 c) 렌더러의 루프에서 달성하고자하는 것이 무엇인지 알지 못합니다. 색상 변경의 결과는 예상치 못한 변화입니다. d) 구성 요소의 수동 크기 조정/위치 지정 절대로 절대 수행하지 마십시오. , 그것은 적절한 LayoutManager의 독점적 인 작업입니다 – kleopatra

+0

나중에 그것을 구현해야만합니다. –

답변

1

TableModel의 열 클래스는 일치해야합니다 :

@Override 
public Class<?> getColumnClass(int columnIndex) { 
    return String.class; 
} 
또한

는, 문제있다 getTableCellRendererComponent에서 내부 루프가 실행되지 않습니다.

for (int i = 0; i < 7; i++) { 
    for (int j = 0; j < j; j++) { 
        ^^^^^---------condition always false, loop will not execute 

모든 셀 구성 요소에 관계없이 getTableCellRendererComponent이 호출되므로이 루프가 필요한 이유는 분명하지 않습니다.

관련 문제