好的,我知道这个问题已经在堆栈溢出中被问了很多。 我读过几乎所有文章。 我绝对不能让它太工作。 我制作了一张桌子,作为酒店的空房日历,我想用0个房间的红色为单元格上色,而绿色的房间大于0个。 我尝试实现表格单元格渲染器无济于事。 这是我所有的代码。 我究竟做错了什么?

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 票数:1 已采纳

如果将String类用作列类

table.setDefaultRenderer(String.class, new MyCellRender());

然后, 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

  ask by Jason McGraw translate from so

未解决问题?本站智能推荐:

2回复

更改JTable中特定单元格的颜色

我正在尝试更改JTable列中一个或多个特定单元格的颜色。 我在这里看到的答案都是关于这种特定方法的。 但是问题是我完全不知道它是如何工作的,在我的另一堂课中,我有一个字符串Jtable,我想根据它们的字符串值更改某些单元格的颜色,但是我发现的解决方案只允许我更改jtable中整个单元
2回复

Jtable单元格中部分文本的自定义颜色

我需要的很简单。 我在jtable中有一列,我需要插入一个带有不同颜色部分的字符串。 例如: 我需要将此[string]插入jTable单元中。 在此示例中,仅单词“ string”应具有红色,其他所有元素均应为灰色。 我怎么做?
3回复

Java-Swing-JTable-设置选定行的颜色,但不设置单元格的颜色

我试图让我的表格在单击一个单元格时选择整行(可以通过关闭列选择来完成),但是,我不希望您单击的特定单元格周围的额外粗边框突出显示。 我原本希望这很容易,但是显然它涉及渲染器,所以我做了很多研究,而我能得到的最接近的是: JTable contactTable = new JTable
1回复

Java-更改JTable中某些单元格的颜色

我有一个称为SponsorIndexArr的整数数组,它包含要更改表中颜色的单元格的索引(我也想使该单元格不可选择)。 该表是一列,因此我只需要单元格的行索引。 这是一些相关的代码: 程序在正确的位置打印“ HERE”。 但是,正在发生的事情是,只有带有SponsorIndex
1回复

jtable多单元格选择

是否可以使用jtable在Java中选择多个不相邻的单元格? 如果没有,是否有替代方法? 谢谢 !
1回复

JTable增量单元格填充

如何根据其值递增地填充JTable Cell。 就像进度条一样。 注意:我不想使用JProgress Bar! 我想知道是否有一种方法可以直接在细胞绘画渲染器中完成
4回复

在jtable中突出显示单元格

我有这个代码fom stackoverflow 如何在jtable中突出显示多个单元格 : 但是当我用它来突出显示一个单元格时,它会给出错误的操作,就像整个数据丢失一样。 我刚接触java swing。 请帮助在按钮按下操作事件中突出显示单元格。 更新:添加我的示例代码:
1回复

如何从存在于JTable单元格内的JTable中选择单元格?

我试图在内部JTable中获取选定的单元格,该单元格存在于JTable中的某个单元格中,但无法执行此操作。 请让我知道,我要去哪里了? 或者,如果有其他替代方法可以做同样的事情。 }
3回复

完全删除jtable网格(单元格边框)

如何完全移除摆动JTable中细胞周围的边界,这样细胞之间没有间隙? 这是我尝试过的: 并编写单元格渲染器并使用: 对于每个单独的细胞。 但结果是细胞之间的线被移除,但它们之间留有1个像素的间隙。
2回复

如何将图像渲染到JTable单元格

我想在我的JTable的单元格上应用渲染器,为此我创建了一个名为myRenderer的类: 我使用这段代码在单元格上应用渲染器: 问题是,rebderer应用于第6列中的所有单元格,我希望它仅应用于一个单元格(行/列),但我不知道该怎么做? 提前致谢