JTable, Renderer mit Button

Status
Nicht offen für weitere Antworten.

nero30

Mitglied
Hallo,
komme grad (wieder) nicht weiter, vielleicht kann mir einer von Euch helfen.
Ich habe eine JTable, darin eine Spalte in der die Zelle folgendermassen aussieht:
Editor: eine JComboBox, die editierbar ist
Renderer: ein JPane mit einem Label um die Daten anzuzeigen + einem kleinen Button rechts davon
Es funktioniert auch alles wunderbar, nur, wenn ich den Button anklicken will, wird logischerweise die Editor-Komponente in der Zelle angezeigt. Wie kann ich das verhindern, sprich, der Editor soll nur kommen, wenn das Label im Renderer angeklickt wird (also der Text in der Zelle), und nicht wenn auf den Button geklickt wird.

Hoffentlich habe ich mich einigermassen verständlich ausgedrückt 😉

Danke und Gruß
nero
 
Ist gar nicht so einfach. Dazu muss der Editor bestimmen können, wann er aufgeht und wann nicht. Zeile 34 hab ich mal so dahingelogen, das kann natürlich ganz anders aussehen:

Java:
new DefaultCellEditor(new JComboBox()) {

  private Point activationMouseLocation;

  @Override
  public Component getTableCellEditorComponent(
        JTable table,
        Object value,
        boolean isSelected,
        int row,
        int column) {
    // if editor has been activated by mouse event, check location
    if (activationMouseLocation != null) {
      final TableCellRenderer renderer =
            table.getCellRenderer(row, column);
      final Component rComp =
            table.prepareRenderer(renderer, row, column);
      rComp.setBounds(table.getCellRect(row, column, false));
      rComp.validate();

      if (rComp instanceof Container) {
        final Container rendererContainer = (Container) rComp;

        // translate location to renderer component coordinate system
        final int x = activationMouseLocation.x - rComp.getX();
        final int y = activationMouseLocation.y - rComp.getY();

        // if the location X/Y is outside the range, return null
        final int count = rendererContainer.getComponentCount();
        for (int i = 0; i < count; i++) {
          final Component comp = rendererContainer.getComponent(i);
          final Point p = SwingUtilities.convertPoint(table, x, y, comp);
          // TODO: Change the criteria to detect the correct component
          if ("this is the component".equals(comp.getName())
                && !comp.contains(p)) {
            return null;
          }
        }
      }
    }

    return super.getTableCellEditorComponent(table, value, isSelected,
          row, column);
  }

  @Override
  public boolean isCellEditable(EventObject anEvent) {
    final boolean editable = super.isCellEditable(anEvent);
    if (editable && anEvent instanceof MouseEvent) {
      final MouseEvent me = (MouseEvent) anEvent;
      activationMouseLocation = me.getPoint();
    } else {
      activationMouseLocation = null;
    }
    return editable;
  }
};
Beachte: Ein CellEditor sollte immer auch mit der Tastatur aktiviert werden können; meist mit [c]F2[/c].

Ebenius
 
Zuletzt bearbeitet:
hi, danke dir für den Code! Das über die Klick-Koordinaten zu machen darüber habe ich auch nachgedacht, nur das Wie fehlte 😉 Allerdings klappt der Code so bei mir nicht ganz, wenn ich in das Feld jetzt reinklicke passiert gar nichts, mit F2 wird der Editor angezeigt.
Werde noch mal ein wenig debuggen und melde mich dann noch mal.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben