JCellRenderer läuft nur einmal in bestimmte Bedingung

Status
Nicht offen für weitere Antworten.

Silkstring

Mitglied
Hallo, ich habe mir gestern das JTable Tutorial von Beni durchgelesen und habe mir dort seinen "MyTableCellRenderer" abgeguckt. Ich brauche nun einen CellRenderer der in Abhängigkeit des Wertes "unsichtbar" eines Feld-Objekts (dem aus der Tabellenzelle) die einzelne Zelle farbig markiert, in meinem Beispiel hab ich das gemacht indem ich die Schriftfarbe einfach grau gesetzt hab. Ich habe in der Tabelle ne Menge Daten von denen einige dieses "unsichtbar" Flag haben, allerdings wird immer nur exakt das erste mit diesem Flag entsprechend markiert. Dazu hab ich nen kleinen Screenshot:

[EDIT]Auf diesem Bild haben alle Elemente außer "p_test5" dieses "unsichtbar" Flag, aber nur das erste Vorkommende wird markiert.
screen_jtable.jpg


Das ist mein CellRenderer:
Code:
public class MyTableCellRenderer extends DefaultTableCellRenderer{
   public Component getTableCellRendererComponent(JTable table, Object value,
                                                  boolean isSelected, boolean hasFocus,
                                                  int row, int column) {
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

      Feld feld = (Feld) value;

      if (feld.getName().equals("") == false) {
        // Anzuzeigender Text
        setText(feld.getName();

        // Unsichtbar - Hintergrundfarbe hellgrau
        if (feld.getUnsichtbar())
          setForeground(Color.LIGHT_GRAY);
        else
          setForeground(Color.BLACK); //Ohne explizites neusetzen werden ALLE Zellen grau!!
      }
      else
        setText("");

      return this;
   }
}

Ich habe übrigens noch ein zweites Problem. Wenn ich eine Zelle auswähle wird automatisch die gesamte Zeile mitmarkiert. (Siehe Bild) Kann man das abschalten?

Danke im Voraus :)
 

Mag1c

Top Contributor
Hi,

bist du 100 pro sicher, daß nicht nur "p_test9" das Unsichtbar-Flag gesetzt hast ?

Es wäre übrigens ein etwas besserer Stil, wenn du die Component von "super.getTableCellRendererComponent" hernehmen würdest, daran dann setText / setBackground aufrufst und diese dann per return zurückgibst.

zur Selektion solltest du dir mal

JTable#setSelectionMode
JTable#setSelectionModel

anschauen.

Gruß
Mag1c
 

Mag1c

Top Contributor
Hmm,

ist das exakt dein ausgeführter Code (ist ein Typo drin, es fehlt ne Klammer) ? Ansonnsten müsstest du mehr Code posten (z.B. den, wo du die Daten für das TableModel erzeugst).

Gruß
Mag1c
 

Illuvatar

Top Contributor
Mag1c hat gesagt.:
Es wäre übrigens ein etwas besserer Stil, wenn du die Component von "super.getTableCellRendererComponent" hernehmen würdest, daran dann setText / setBackground aufrufst und diese dann per return zurückgibst.

Das kommt aufs gleiche heraus, weil super.getTableCellRendererComponent(bla) auch nur this zurückgibt.
Edit: Ach besserer Stil - naja ka... ich finds so ok ;)

Also bei mir funktioniert dein Code gut:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JTableTest extends JFrame
{
  // Anfang Variablen
  JTable jt = new JTable (new Object[][]{
    {
      new Feld ("p_test5", false), new Feld ("xyz", false)
    },{
      new Feld ("p_test9", true), new Feld ("xyz", false)
    },{
      new Feld ("p_test7", true), new Feld ("xyz", false)
    },{
      new Feld ("p_test8", true), new Feld ("xyz", false)
    },{
      new Feld ("p_test6", true), new Feld ("xyz", false)
    } ,{
      new Feld ("p_test10", true), new Feld ("xyz", false)
    }
  }, new Object[]{
    "bla1", "bla2"
  });
  // Ende Variablen

  public JTableTest(String title)
  {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); } });
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());

    // Anfang Komponenten
    jt.setDefaultRenderer (Object.class, new MyTableCellRenderer());
    add ("Center", jt);
    // Ende Komponenten

    setSize (800,600);
    setLocationRelativeTo (null);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  // Ende Ereignisprozeduren

  private class Feld
  {
    public Feld (String bla, boolean invis)
    {
      this.bla = bla;this.invis = invis;
    }
    public String bla;
    public boolean invis;
  }
  private class MyTableCellRenderer extends javax.swing.table.DefaultTableCellRenderer{
    public Component getTableCellRendererComponent(JTable table, Object value,
                                                  boolean isSelected, boolean hasFocus,
                                                  int row, int column)
    {
      super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

      Feld feld = (Feld) value;

      if (feld.bla != null) {
        // Anzuzeigender Text
        setText(feld.bla);

        // Unsichtbar - Hintergrundfarbe hellgrau
        if (feld.invis)
          setForeground(Color.LIGHT_GRAY);
        else
          setForeground(Color.BLACK); //Ohne explizites neusetzen werden ALLE Zellen grau!!
      }
      else
        setText("");

      return this;
    }
  }

  public static void main(String[] args) {
    new JTableTest("JTableTest");
  }
}
 

Silkstring

Mitglied
hmm, also ich benutze jdk 1.4.2, übriger Code wäre der hier:

Hier wird die Tabelle gesetzt:
Code:
    tablemodel = new MyTableModel(feldliste, ueberschriften);
    jT_felder = new JTable(tablemodel);
    jT_felder.setDefaultEditor(Object.class, new MyCellEditor(new JTextField()));
    jT_felder.setDefaultRenderer(Object.class, new MyTableCellRenderer());
    JScrollPane jsp = new JScrollPane(jT_felder);

mein TableModel:
Code:
public class MyTableModel extends DefaultTableModel {
  public MyTableModel(Object[][] p0, Object[] p1) {
    super(p0, p1);
  }
  public MyTableModel(int r, int c) {
    super(r, c);
  }
  public boolean isCellEditable(int r, int c) {
    return true;
  }
}

und mein CellEditor (Der mir ebenso enorm Kopfzerbrechen bereitet):
Code:
public class MyCellEditor extends DefaultCellEditor {
  public MyCellEditor(JTextField jTF) {
    super(jTF);
    jTF.setEditable(true);
  }

  public boolean isCellEditable(EventObject e) {
    if (e instanceof MouseEvent) {
      MouseEvent me = (MouseEvent) e;
      if (me.getClickCount() == 2) { // Doppelklick
        Object feld = super.editorComponent;
        if (feld instanceof JTextField) {
          new STDFeldEigenschaften((Feld) feld);
        }
      }
    }
    return false;
  }
}

hm illuvatar.. wahrscheinlich funktioniert es wirklich nur bei mir nicht :D
aber - um nochmal eine frage vorweg reinzuwerfen:

bei dem CellEditor ist es folgendermaßen:
Nach einem Doppelklick auf eine Zelle soll sich ein Eingabedialog öffnen (STDFeldEigenschaften), dieser braucht ein Feld als Parameter, ich dachte das ich mir dieses über super.editorComponent bzw super.getCellEditorValue() holen kann. Leider geben beide nur jeweils ein leeres JTextField zurück mit dem man nichts anfangen kann, da getText() dementsprechend nur einen leeren String zurückgibt. Der Feldname in der Zelle würde mir auch schon genügen da ich mir über ihn das entsprechende Feld holen kann das ich brauche.. weiß jemand da vielleicht ne Lösung? Ich hatte auch schon versucht den Dialogaufruf in die isCellEditable Methode vom CellRenderer reinzumachen aber das funktioniert nicht weil ich da kein Event habe womit ich ihn bedingt aufrufen kann. :|
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
N Programm Läuft nicht auf anderen Pcs AWT, Swing, JavaFX & SWT 9
MiMa Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
L JavaFX TreeView aufstellen läuft irgendwie auf Endlosschleife AWT, Swing, JavaFX & SWT 3
O LayoutManager pagelayout - Example läuft einfach nicht ! AWT, Swing, JavaFX & SWT 6
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
R Swing Programm läuft nur beim Debuggen korrekt ab AWT, Swing, JavaFX & SWT 4
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
J JavaFX Anwendung läuft in eclipse, nicht aber exportiert AWT, Swing, JavaFX & SWT 2
N Programm läuft perfekt in Eclipse aber nicht in .JAR AWT, Swing, JavaFX & SWT 3
P Swing GUI noch nicht gezeichnet - Logik läuft - blockiert AWT, Swing, JavaFX & SWT 3
S Swing JProgressBar läuft nicht mit AWT, Swing, JavaFX & SWT 12
E Animation läuft nicht mehr flüssig AWT, Swing, JavaFX & SWT 8
P Einfaches GUI läuft nicht AWT, Swing, JavaFX & SWT 6
A AWT Beim (mehrmaligen) Screenshot machen läuft der Speicher voll AWT, Swing, JavaFX & SWT 2
R GUI hängt während Programm läuft AWT, Swing, JavaFX & SWT 7
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
G SWT-App läuft nicht unter OSX, unter Win aber problemlos AWT, Swing, JavaFX & SWT 3
G Programm läuft nur auf manchen Rechnern AWT, Swing, JavaFX & SWT 10
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
S Swing Hyperlink mit Hyperlinklistener läuft Amok AWT, Swing, JavaFX & SWT 3
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
M Button funktioniert nicht mehr wenn Schleife läuft AWT, Swing, JavaFX & SWT 3
K Mein Informatikprojekt läuft aus dem Ruder Hilfe. F1 ^^ AWT, Swing, JavaFX & SWT 5
D Programm läuft unter XP aber nicht unter Knoppix AWT, Swing, JavaFX & SWT 6
A GtkLookAndFeel - läuft nicht . AWT, Swing, JavaFX & SWT 13
G Wie läuft ein GUI AWT, Swing, JavaFX & SWT 4
P WM 2006 - The Memory Game :P läuft nicht. AWT, Swing, JavaFX & SWT 15
M sicherstellen, dass nur eine Instanz läuft. AWT, Swing, JavaFX & SWT 6
G Eintrag soll nur einmal in Listview zu sehen sein AWT, Swing, JavaFX & SWT 3
J Nur einmal?? AWT, Swing, JavaFX & SWT 2
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
Paul15 Button funktioniert nur einmal AWT, Swing, JavaFX & SWT 9
M JavaFX WebView lässt sich nur einmal öffnen AWT, Swing, JavaFX & SWT 2
J Abbrechen muss immer einmal mehr gedrückt werden AWT, Swing, JavaFX & SWT 3
H messageDialog nur einmal anzeigen lassen? AWT, Swing, JavaFX & SWT 2
J Button Event nur einmal ausführen AWT, Swing, JavaFX & SWT 3
GianaSisters jList nur einmal ein Element anklicken AWT, Swing, JavaFX & SWT 3
S Objekt einmal laden zweimal anzeigen 3d AWT, Swing, JavaFX & SWT 6
J AWT Einmal FileDialog-Beispiel für Dumme bitte AWT, Swing, JavaFX & SWT 6
J Programm nur einmal öffnen AWT, Swing, JavaFX & SWT 3
R Noch einmal x^2 bzw. parabel AWT, Swing, JavaFX & SWT 2
E wieder einmal JTable AWT, Swing, JavaFX & SWT 5
M Mehrere Bilder auf einmal anzeigen AWT, Swing, JavaFX & SWT 9
O Swing Button löst zweimal aus, obwohl nur einmal geklickt AWT, Swing, JavaFX & SWT 3
M AWT Mehrere JToolBars auf einmal? AWT, Swing, JavaFX & SWT 5
S Objekt wird während Endlosschleife nur einmal bewegt AWT, Swing, JavaFX & SWT 2
A Card Panel wird nur einmal eingeblendet AWT, Swing, JavaFX & SWT 3
I TrayIcon aber bitte nur einmal AWT, Swing, JavaFX & SWT 2
G KeyListener funktioniert nur einmal AWT, Swing, JavaFX & SWT 2
H JFrame nur einmal öffnen AWT, Swing, JavaFX & SWT 9
I validate() funtioniert nur einmal AWT, Swing, JavaFX & SWT 6
M Kann ein SwingWorker nur einmal laufen? AWT, Swing, JavaFX & SWT 2
M wieder einmal JScrollPane und JList AWT, Swing, JavaFX & SWT 4
V JMenu und die Tabs von JTabbedFrame sind auf einmal schwarz AWT, Swing, JavaFX & SWT 3
J Einmal gleichzeitig auf zwei Graphics malen? AWT, Swing, JavaFX & SWT 5
M gif nur einmal abspielen AWT, Swing, JavaFX & SWT 2
H Noch einmal JList (nichts auswählen) AWT, Swing, JavaFX & SWT 2
W JTabele Aktualisieren - Wieder einmal AWT, Swing, JavaFX & SWT 4
TheJavaKid font lässt sich bei der jtextarea nur einmal ändern AWT, Swing, JavaFX & SWT 3
A Wieder einmal Event-Dispatch-Thread AWT, Swing, JavaFX & SWT 5
F SWT Dialog lässt sich nur einmal öffnen AWT, Swing, JavaFX & SWT 3
U Fenster darf nur einmal existieren AWT, Swing, JavaFX & SWT 6
P JCheckbox einmal gewählt immer gewählt ? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben