2016-06-06 20 views
-1

Ich mache einen Zeitplan mit Java, aber ich kann ein Problem nicht lösen.Wie kann ich denselben Wert in der JTable mit DefaultTableCellRenderer verbergen

Ich möchte die Vordergrundfarbe als Hintergrundfarbe ändern oder einen Wert ausblenden, wenn einige Zellen bei der ersten erkannten Zelle den gleichen Wert haben.

Like this ...

Hier ist, was ich gemacht ...

(Tut mir leid koreanische Wörter ...)

Also, ich möchte eine DefaultTableCellRenderer verwenden, aber ich kann kein gutes Beispiel dafür finden.

Und ich weiß nicht, wie DefaultTableCellRenderer funktioniert. Kann nicht finden, erklärt etwas darüber ...

Also möchte ich um einen Gefallen für dieses Problem bitten.

Hier ist mein Code:

public class subject_table_renderer extends DefaultTableCellRenderer 
{ 
private Object subject_name = ""; 
@Override 
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
{ 
    Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
    if (! isSelected) 
    { 
     if(value.equals("")){ 
       cell.setBackground(Color.WHITE); 
     } 
     else{ 
      String[] temp = MainFrame.find_list((String)value, MainFrame.subject); 
      //take a subject_list for decide background color 

      if(!value.equals(subject_name)){ 
       subject_name = value; 
       cell.setBackground(get_rand_color(cell, Integer.parseInt(temp[6]))); 
      } 
      else{ 
       cell.setBackground(get_rand_color(cell, Integer.parseInt(temp[6]))); 
       cell.setForeground(get_rand_color(cell, Integer.parseInt(temp[6]))); 
      } 
     } 
    } 
    return cell; 
} 
+0

'subject_table.setShowGrid (false);' ..? (Dann müssten Sie die Grenzen im Renderer fälschen) –

+1

umm ... Ich meine, verstecken Sie den 'Wert' in der Zelle, verstecken Sie keine 'Linie' auf dem Tisch ... –

+1

Oh,. .mein Fehler! : P –

Antwort

1

Und ich weiß nicht, wie DefaultTableCellRenderer funktioniert. Kann nicht finden, erklärt etwas darüber ...

Vielleicht mit dem Swing-Tutorial auf Concepts: Editors and Renderers starten.

Sie können keine Instanzvariable verwenden, um den vorherigen Wert zu verfolgen, da nicht garantiert werden kann, dass die Zeilen immer in sequentieller Reihenfolge gerendert werden. Wenn z. B. Zeile 1 ausgewählt ist und Sie auf Zeile 10 klicken, werden nur die Zeilen 1 und 10 neu gezeichnet.

So ist die Lösung des vorherigen Wert in dem Render mit Code so etwas wie zu vergleichen:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.text.*; 
import javax.swing.table.*; 

public class SSCCE extends JPanel 
{ 
    public SSCCE() 
    { 
     setLayout(new BorderLayout()); 

     JTable table = new JTable(10, 1); 
     table.setValueAt("one", 0, 0); 
     table.setValueAt("one", 1, 0); 
     table.setValueAt("two", 2, 0); 
     table.setValueAt("two", 3, 0); 
     table.setValueAt("two", 4, 0); 
     table.setValueAt("three", 5, 0); 
     add(new JScrollPane(table)); 

     table.setDefaultRenderer(Object.class, new DuplicateRenderer()); 
    } 

    /* 
    ** Color the focused cell 
    */ 
    class DuplicateRenderer extends DefaultTableCellRenderer 
    { 
     @Override 
     public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
     { 
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      if (row > 0 && value != null) 
      { 
       Object previous = table.getValueAt(row - 1, column); 

       if (value.equals(previous)) 
       { 
        setText(""); 
       } 
      } 

      return this; 
     } 
    } 


    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 
+0

WOW! Du hast eine perfekte Antwort !!!! Danke für Ihre Hilfe! –