Изменение цвета определенной ячейки в JTABLE - PullRequest
0 голосов
/ 29 ноября 2018

Я работаю над курсовой работой и в течение 3 недель пытаюсь изменить цвет только для конкретной ячейки.Мне нужен красный и зеленый в зависимости от некоторых условий:

    private static void showGUI(){
        JTable table = new JTable() ;
             class BoardTableCellRenderer extends DefaultTableCellRenderer {
  @Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasocus, int row, int col)
{
    this.setOpaque(true);
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasocus, row, col);
    Color redColor = Color.RED;
    Color greenColor = Color.GREEN;
    //books color
    for(int i=0;i<bookCount;i++){
    if (library.bookArray[i].getAvailability()==1){
        c.setForeground(redColor);
    }else{
        c.setForeground(greenColor);
    }}
    return c;
}

 }
    String columnNames[] = {"Book", "DVD"};
    Object[][] data = new String[library.bookCount+1][library.dvdCount+1];
    if(bookCount>0){
    for(int i=0; i<bookCount;i++){
    data[i][0]=(i+1)+". ISBN: "+library.bookArray[i].getISBN()+" / Title: "+library.bookArray[i].getTitle()+" / Author name: " + library.bookArray[i].getAuthorName() + " / Author Origin: " + library.bookArray[i].getAuthorOrigin() + " / Sector: " + library.bookArray[i].getSector()+" / Publication Date: " + library.bookArray[i].getPubDate() + " / Publisher: " + library.bookArray[i].getPublisherName()+" / Total pages: " + library.bookArray[i].getTotalPages();
    }
    }
    //DVD
    if (dvdCount>0){
    for(int i=0; i<dvdCount;i++){
    data[i][1]=(i+1)+". ISBN: "+library.dvdArray[i].getISBN()+" / Title: "+library.dvdArray[i].getTitle()+"Language: "+library.dvdArray[i].getLanguage()+" Subtitle: "+library.dvdArray[i].getSubtitle()+" Sector: "+library.dvdArray[i].getSector()+"Publication Date: "+library.dvdArray[i].getPubDate()+" Producer: "+library.dvdArray[i].getProducer()+" Actors: "+library.dvdArray[i].getActors();

    }
    }

    table.setDefaultRenderer(String.class, new BoardTableCellRenderer());
     table.setFocusable(false);
  table.setRowMargin(0);
  table.setIntercellSpacing(new Dimension(0, 0));
  table.setRowSelectionAllowed(false);
  table.setVisible(true);



    TableModel model = new DefaultTableModel(data, columnNames);
    table.setModel(model);

    JScrollPane scrollPane = new JScrollPane(table);
    table.setGridColor(Color.BLACK);

    JLabel lblName = new JLabel("Enter Title to search:");
    JTextField tfName= Library.createRowFilter(table);
    JPanel panel = new JPanel();
    panel.setLayout(new SpringLayout());
    panel.add(lblName);
    panel.add(tfName);
    tfName.setSize(30,30); 

    JFrame frame = new JFrame("Library");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(scrollPane,BorderLayout.SOUTH);
    frame.add(lblName,BorderLayout.BEFORE_FIRST_LINE);
    frame.add(tfName,BorderLayout.LINE_START);
    frame.validate();
    frame.setSize(1700, 500);
    frame.setVisible(true);

Как вы можете видеть, я использую массив из другого класса, мне нужен красный цвет для недоступных книг (.getAvailability () == 1) изеленый для доступных.То, что я пробовал до сих пор, либо изменяет весь столбец, либо всю строку

Спасибо!

1 Ответ

0 голосов
/ 29 ноября 2018

Есть пара очевидных проблем с кодом, который торчит (кроме форматирования и длинного тела метода).

this.setOpaque(true);
Component c = super.getTableCellRendererComponent(table, value, isSelected, hasocus, row, col);

Вероятно, должно быть

Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
c.setOpaque(true);

И вам следуетустановить только передний план для книги, с которой вы имеете дело.

Color redColor = Color.RED;
Color greenColor = Color.GREEN;
//books color
for(int i=0;i<bookCount;i++){
if (library.bookArray[i].getAvailability()==1){
    c.setForeground(redColor);
}else{
    c.setForeground(greenColor);
}}

Вероятно, должно быть:

c.setForeground(
    library.bookArray[row].getAvailability()==1 ?
    Color.RED :
    Color.GREEN
);

Редактировать: Далее я заметил, что вы установилиПользовательский рендерер по умолчанию для столбцов типа String, но не установлен Class для столбцов (типы отдельных ячеек во время выполнения не проверяются, если вы сами не делаете это).Лучше всего позвонить TableColumn.setCellRenderer для соответствующего столбца TableColumnModel.

...