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:
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