JTable und JCombobox ?

Status
Nicht offen für weitere Antworten.

HaGs

Mitglied
Hallo zusammen,

Ich habe eine JTable und für eine Spalte eine JComboBox definiert. Auf die Table habe ich einen MouseListener gelegt, um festzustellen, welche Reihe gerade ausgewählt ist. Auf die CBox habe ich einen ItemListener gelegt, um auf Änderungen zu reagieren.
Beim Klicken auf die CBox wird zuerst der ItemListener aufgerufen und dann erst der MouseListener durchlaufen (habe ich mit println() aufrufen probiert).
Für meine Anwendung sollte aber zuerst der Mouse- und dann der ItemListener durchlaufen werden, weil im ItemListener die aktuell ausgewählte Zeile (bei klick auf die CBox) verarbeitet werden soll.

Wähle ich zuerst eine andere Zelle (nicht die CBox) und markiere somit die Reihe, und klicke ich dann die CBox, dann funktioniert alles wunderbar.

Wie kann ich die Reihenfolge ändern oder beeinflussen??

Hier ist Code, der die Tablle aufbaut:


Code:
class TabelleInit_ extends JScrollPane {// implements Serializable {
  private static final TabelleInit_ tabelleInit_=new TabelleInit_();
  //
  JTable tabelle_;
  JScrollPane scrPane_;
  static DefaultTableModel defTModel_;
  TableColumnModel colModel_;
  int C=JLabel.CENTER, R=JLabel.RIGHT, L=JLabel.LEFT;
  //                   0            , 1                          , 2
  //                   3            , 4                          , 5
  //                   6            , 7                          , 8
  int[] colAlign_   ={ C            , L                          , R,
                       C            , L                          , L,
                       L            , L };
  String[] sName_   ={ "Nr"         , "Verzeichniss/Directories" , "Intervall [min]", 
                       "run"        , "Files"                    , "Filegröße",
                       "ModSumm"    , "NameSumm" };//                , "run" };
  Object[] zData_   ={ null         , null                       , 120,
                       false        , null                       , null,
                       null         , null };//                      , false };
  int[] sBreite_    ={ 32           , 380                        , 88,
                       35           , 40                         , 80,
                       110          , 80 };//                        , 35 };
  boolean[] colEdit_={false         , false                      , true,
                      false         , false                      , false,
                      false         , false };//                     , false };
  Class[] typen_=new Class [] {
                      Number.class  , String.class               , JComponent.class,
                      Boolean.class , Number.class               , Number.class,
                      Number.class  , Number.class };//              , Boolean.class };
  static int aktRow_=0;
  final String[] comboValues_=new String[]{ "120", "60", "30", "15", "5", "1" };
  //
  TabelleInit_() {//Konstruktor
    //String[] comboValues_=new String[]{ "120", "60", "30", "15", "5", "1" };
    tabelle_=new JTable(new MyTabMod_());
    defTModel_=(DefaultTableModel)tabelle_.getModel();
    colModel_ =tabelle_.getColumnModel();
    tabelle_.setOpaque(true);
    tabelle_.setShowGrid(false);
    tabelle_.setRowHeight(20);
    tabelle_.setRowSelectionAllowed(true);
    tabelle_.setBackground(getBackground());
    tabelle_.getTableHeader().setResizingAllowed(true);
    tabelle_.getTableHeader().setReorderingAllowed(false);
    tabelle_.setDefaultRenderer(JComponent.class, new MyJComponentRend_());
    tabelle_.setDefaultEditor  (JComponent.class, new JComponentCellEditor_());
    for (int i=0; i<zData_.length; ++i) {
      defTModel_.addColumn(sName_[i]); }
    for (int i=0; i<zData_.length; ++i) {
      tabelle_.getColumnModel().getColumn(i).setPreferredWidth(sBreite_[i]);
      tabelle_.getColumnModel().getColumn(i).setMinWidth(sBreite_[i]);
    }
    //
    final PopupMenu_ popmen_=new PopupMenu_();
    //Der MouseListener wird anscheinend erst nach dem ItemListener
    //aufegrufen
    tabelle_.addMouseListener( new MouseAdapter() {
          int x;
          public void mouseReleased( MouseEvent me_ ) {
            if ( me_.isPopupTrigger() ) {
              popmen_.show( me_.getComponent(), me_.getX(), me_.getY() );
            }
            int x_=me_.getX(); int y_=me_.getY();
            aktRow_=tabelle_.rowAtPoint(new Point(x_,y_));
            tabelle_.setRowSelectionInterval(aktRow_, aktRow_);
            //nur für Testzwecke
            System.out.println("MouseEvent Nr "+x+", in Row "+aktRow_);
            x++;
          }
        } );
    //
    setPreferredSize(new Dimension(WatchDir02_.frameDim_.width-20, 143));
    tabelle_.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    tabelle_.setPreferredScrollableViewportSize(new Dimension(WatchDir02_.frameDim_.width-20, 143));
    setViewportView(tabelle_);
  }//Methode Ende
  static void delAllRows_() {
    int rows_=defTModel_.getRowCount();
    for (int i=rows_; i>0; i--) {
      defTModel_.removeRow(i-1);
      System.out.println("D ["+WatchDir02_.df_.format(Calendar.getInstance().getTime())+
                         "] Zeile "+i+" entfernt.");
    }
    defTModel_.fireTableDataChanged();
  }
  static void delRow_(int rowIndex_) {
    try {
    //falls ein Task läuft, dann vorher beenden
    Task_.getInstance_().remove_(rowIndex_);
    System.out.print("D ["+WatchDir02_.df_.format(Calendar.getInstance().getTime())+"] Zeile zu ");
    System.out.println(defTModel_.getValueAt(rowIndex_,1)+", entfernt.");
    //falls kein Task läuft kann die Reihe gelöscht werden
    defTModel_.removeRow(rowIndex_);
    defTModel_.fireTableDataChanged();
    int rows_=defTModel_.getRowCount();
    if( rows_>0 ) {
      for (int i=0; i<rows_; i++) {
        defTModel_.setValueAt(String.valueOf(i+1), i, 0);
      }
    }
    } catch (Exception e_) {System.out.println("Fehler in delRow"); }
  }//Methode Ende
  static void addRow_(String directory_, String intervall_,
                      Boolean run_   , int filesCount_,
                      Long filesSize_, Long lastModSumm_,
                      int asciiNameSumm_ )
  {
    int rows_=defTModel_.getRowCount();
    defTModel_.addRow(getInstance_().zData_);
    defTModel_.fireTableDataChanged();
    rows_=defTModel_.getRowCount();
    if( rows_>0 ) {
      defTModel_.setValueAt(    directory_, rows_-1, 1);
      defTModel_.setValueAt(    intervall_, rows_-1, 2);
      defTModel_.setValueAt(          run_, rows_-1, 3);
      defTModel_.setValueAt(   filesCount_, rows_-1, 4);
      defTModel_.setValueAt(    filesSize_, rows_-1, 5);
      defTModel_.setValueAt(  lastModSumm_, rows_-1, 6);
      defTModel_.setValueAt(asciiNameSumm_, rows_-1, 7);
      for (int i=0; i<rows_; i++) {
        defTModel_.setValueAt(String.valueOf(i+1), i, 0); }
    }
    else { return;}
  }//Methode Ende
  static Boolean checkIfExistsEntry_(String value_) {
    int rows_=defTModel_.getRowCount();
    if(rows_>0) {
      for( int i=0; i<rows_; i++ ) {
        if(defTModel_.getValueAt(i, 1).equals(value_)) {
          return true;
        }
      }
    }
    return false;
  }//Methode Ende
  class MyTabMod_ extends DefaultTableModel {
    public boolean isCellEditable(int row_, int col_) {
      return colEdit_[col_];
    }//Methode Ende
    public Class getColumnClass(int index_) {
      return typen_[index_];
    }//Methode Ende
  }//Class Ende
  public class MyJComponentRend_ implements TableCellRenderer {
    private JComboBox combo_=new JComboBox(comboValues_);
    public Component getTableCellRendererComponent (JTable table, Object value_,
      boolean isSelected, boolean hasFocus, int row, int column) {
      combo_.setSelectedItem(value_);
      return combo_;
    }//Methode Ende
  }//Class Ende
  //
  public class JComponentCellEditor_ extends AbstractCellEditor //{
                                     implements TableCellEditor {
    JComboBox combo_;
    int row_;
    int col_;
    public JComponentCellEditor_() {//Konstruktor
      combo_=new JComboBox(comboValues_);
      combo_.addItemListener(new ComboListener_());
    }
    public Object getCellEditorValue() {
      return combo_.getSelectedItem();
    }//Methode Ende
    public Component getTableCellEditorComponent(JTable table_, Object value_,
          boolean isSelected_, int row_, int col_) {
      combo_.setSelectedItem(value_);
      return combo_;
    }//Methode Ende
    class ComboListener_ implements ItemListener {
      public void itemStateChanged(ItemEvent e_) {  
        JComboBox comb_=(JComboBox)e_.getSource();
        int combVal_=Integer.valueOf((String)comb_.getSelectedItem());
        int aktTabMin_=Integer.parseInt((defTModel_.getValueAt(aktRow_, 2)).toString());
        fireEditingStopped();
        if(e_.getStateChange() == ItemEvent.SELECTED) {
          System.out.println("TabValue: "+defTModel_.getValueAt(aktRow_,2)+
                             ",  in: "+aktRow_+
                             ",  ComboVal: "+combo_.getSelectedItem()+
                             ",  State: "+e_.getStateChange()
                             );
          //Hier soll die Aktion ausgelöst werden, wenn die CBox geändert wird
          //die aktRow_ wird aber nicht übernommen, weil der MouseListener hier
          //noch nicht aufgerufen wurde
          //Task_.getInstance_().stoppen_(aktRow_);
          //Task_.getInstance_().starten_(aktRow_);
        }
      }//Methode Ende
    }//Class Ende
  }//Class Ende
  public static TabelleInit_ getInstance_() {
    return tabelleInit_;
  }//Methode Ende
}//Class Ende
 

Marco13

Top Contributor
Der Code ist ziemlich unübersichtlich (diese _unterstriche_ :autsch: ...), aber ... würde es nicht reichen, wenn du dir die aktuelle Zeile in der
getTableCellEditorComponent
merken würdest? DAS ist die Zeile, wo "die letzte" ComboBox erschienen ist - das müßte doch immer die richtige sein ???:L
 

HaGs

Mitglied
Hallo Marco,

danke für Deine Anregung, habe ich gerade ausprobiert, leider ohne den gewünschten Erfolg.

Im Prinzip sollte es so sein:
Ich klicke in die CBox und wähle einen neuen Wert aus, wenn sich die CBox schliesst dann sollte der ItemListener() reagieren, und die aktuelle Zeile zur Verfügung haben. Er reagiert aber schon früher.

Momentan ist es so:
1.) Ich klicke in die CBox in einer Tabellezeile. Der ItemListener() wird aufgerufen und dann die getTableCellEditorComponent() Methode (hier wird meine Variable aktRow_ aktualisiert). Ich wähle einen neuen Wert aus, und der ItemListener() wird wieder aufgerufen.

2.) Ich wähle jetzt eine CBox in einer anderen Zeile. Der ItemListener() wird aufgerufen. Nun hat meine Variable aktRow_ aber den Wert von vorhin (siehe 1. ), undnicht den Wert der gewählten CBox????!!!!!!. Die getTableCellEditorComponent() Methode wird aufgerufen und erst jetzt ist meine aktRow_ wieder richtig, doch jetzt ist es zu spät.

Irgendwie ist hier das Verhalten der CBoxmerkwürdig.
Wie kann ich es richtig machen?
Vielleich wird es verständlicher wenn jemand Lust hätte das Verhalten des kompletten Proramm zu testen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4
D Swing Erstes Item einer JCombobox in JTable anzeigen AWT, Swing, JavaFX & SWT 2
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
F Swing JComboBox in JTable AutoComplete + Tab AWT, Swing, JavaFX & SWT 4
M JComboBox Item-Auswahl in JTable AWT, Swing, JavaFX & SWT 2
H Unterschiedliche JComboBox je JTable Zeile AWT, Swing, JavaFX & SWT 4
D Swing jTable mit jComboBox in einem Coloumn AWT, Swing, JavaFX & SWT 28
S Einzelne JComboBox in JTable austauschen AWT, Swing, JavaFX & SWT 4
S Swing AWT-Exception bei JTable mit JComboBox beim Löschen der letzten Zeile AWT, Swing, JavaFX & SWT 3
C jComboBox in jTable ohne Klick öffnen AWT, Swing, JavaFX & SWT 4
O Swing JComboBox in JTable AWT, Swing, JavaFX & SWT 14
K Swing JComboBox in JTable AWT, Swing, JavaFX & SWT 9
B JComboBox in JTable, Actionlistener AWT, Swing, JavaFX & SWT 10
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
M Swing jcombobox als jtable-editor: neues Item auswählen AWT, Swing, JavaFX & SWT 4
N jTable mit JComboBox auslesen AWT, Swing, JavaFX & SWT 6
K Swing JTable mit JComboBox AWT, Swing, JavaFX & SWT 10
A JComboBox bei Veränderungen in der JTable mit aktualisieren AWT, Swing, JavaFX & SWT 6
A JComboBox-Zeilen in JTable AWT, Swing, JavaFX & SWT 2
W JComboBox in einer Reihe von JTable AWT, Swing, JavaFX & SWT 7
G Swing JComboBox in JTable beim Aufklappen befüllen AWT, Swing, JavaFX & SWT 3
S JComboBox in JTable wird erst nach klick angezeigt AWT, Swing, JavaFX & SWT 2
O JCombobox in EINER JTable Cell AWT, Swing, JavaFX & SWT 5
G JComboBox und JTable transparent AWT, Swing, JavaFX & SWT 18
D JCombobox in JTable AWT, Swing, JavaFX & SWT 5
J JCombobox in JTable klappt beim ersten Tastendruck zu AWT, Swing, JavaFX & SWT 3
G JTable mit JComboBox als Celleditor, selectedRow falsch! AWT, Swing, JavaFX & SWT 3
A JCombobox in JTable AWT, Swing, JavaFX & SWT 4
S JCbox in Jtable Zelle nur anzeigen , wenn JCombobox ="a AWT, Swing, JavaFX & SWT 3
M JComboBox in JTable immer sichtbar AWT, Swing, JavaFX & SWT 16
R JComboBox über ein AstractTableModel in eine JTable packen AWT, Swing, JavaFX & SWT 2
S JTable (Scrollpane und ColumnNames) und JComboBox AWT, Swing, JavaFX & SWT 2
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
TRunKX Kann man ne JCOmboBox in eine JTAble einfügen AWT, Swing, JavaFX & SWT 10
D JTable und JComboBox oder CheckboxGroup AWT, Swing, JavaFX & SWT 6
S JComboBox in JTable AWT, Swing, JavaFX & SWT 8
K JTable als Popup in einer JComboBox? AWT, Swing, JavaFX & SWT 3
B Wert einer JCombobox in einer JTable setzen AWT, Swing, JavaFX & SWT 2
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23
T Swing JTable / FocusListener AWT, Swing, JavaFX & SWT 0
it_is_all Warum wird die JTable im JDialog nicht angezeigt? AWT, Swing, JavaFX & SWT 1
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
T Swing Double Click bei Buttons in JTable AWT, Swing, JavaFX & SWT 9
J addRow bei JTable AWT, Swing, JavaFX & SWT 6
M Jtable gibt -1 wert bei selectedRow und Column AWT, Swing, JavaFX & SWT 3
Meeresgott Swing JTable AWT, Swing, JavaFX & SWT 4
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
Thallius JTable dynamisch Spaltenanzahl verändern AWT, Swing, JavaFX & SWT 2
Thallius JTable dynamisch laden? AWT, Swing, JavaFX & SWT 2
B Swing JTable sortieren AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben