Wieder Probleme mit CellEditor

THEJS

Mitglied
Hi!

Ich hätte wieder mal eine Frage bezüglich JTable und CellEditor.

Ich hab mit einen CellEditor geschrieben - das ganze heißt ArticleSelectionEditor und besteht aus einem Textfeld und einem Button:
Java:
public class ArticleSelectionEditor extends AbstractCellEditor implements TableCellEditor {

	private static final long serialVersionUID = 1L;
	
	String originalValue;
	
	JButton btnMore = new JButton();
	JTextField txtField = new JTextField();
	JComponent component = new JPanel();
	
	public ArticleSelectionEditor() {
		
		btnMore.setText("...");
		btnMore.setPreferredSize(new Dimension(20, 8));
		btnMore.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				ArticleSelectionDialog dlg = new ArticleSelectionDialog("Wählen Sie einen Artikel aus der Liste");
				int result = dlg.showDialog();
				if(result > 0)
				{
					txtField.setText(dlg.getArtikelnr());
				}
			}
		});
		
		txtField.requestFocus();
		
		component.setLayout(new BorderLayout());
		component.add(txtField, BorderLayout.CENTER);
		component.add(btnMore, BorderLayout.EAST);
		component.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent arg0) {
				txtField.setText(originalValue);
				txtField.requestFocusInWindow();
				txtField.selectAll();
			}
		});
		
	}

	@Override
	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column) {
		originalValue = value.toString();
		txtField.setText(originalValue);
		component.requestFocus();
		return component;
	}

	@Override
	public Object getCellEditorValue() {
		try
		{
			if(DBConnection.executeQuery("SELECT productid FROM product WHERE productnr = '" + txtField.getText() + "'").next())
			{
				return txtField.getText();
			} else
			{
				JOptionPane.showMessageDialog(null, "Eingegebene Artikelnummer existiert nicht in der Datenbank!", "Falsche Eingabe", JOptionPane.ERROR_MESSAGE);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return originalValue;
	}

Mein CellEditor soll nun, wenn man diesen aktiviert (öffnet - wie sagt man da?), den Text im TextFeld markieren.
Das Funktioniert an und für sich schon recht gut, nur funktionierts nicht, wenn man mit dem Fokus auf der Zelle ist und man einen Buchstaben oder eine Zahl eingibt.

Ich habe das Problem schon einmal gehabt, einen Thread aufgemacht und habs dann auch lösen können, nur steh ich jetzt wieder an, wenn es um ein Panel als Editor geht.

Danke für eure Hilfe

greez
THEJS
 
Hi,
wenn ich dich richtig verstehe, müsstest du statt dem Panel dem FocusListener zuzuweisen
Java:
	component.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent arg0) {
				txtField.setText(originalValue);
				txtField.requestFocusInWindow();
				txtField.selectAll();
			}
		});
einfach nur dem TextField dem Listener zuweisen
Java:
	textField.addFocusListener(new FocusAdapter() {
			@Override
			public void focusGained(FocusEvent arg0) {
				txtField.selectAll();
			}
		});
Dabei sollte es m.E. auch nicht nötig sein, nochmal den Text zu setzen...

Grüße!
 
Danke für deine schnelle Antwort Artorius!

Aber, mein Problem ist, dass der Fokus auf dem Panel liegt (nehm ich jetzt mal an) der FocusListener aber garnicht angesprochen wird.
(Was wir ja schon mal hatten ;))

Kann das sein, dass das ein BUG von Java ist? bzw. halt vom JTable oder Model?

greez
 
Ah, jetzt hats auch wieder geklingelt...
Das müsst es doch sein, oder?
Code:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * TestFrame.java
 *
 * Created on 25.03.2010, 15:23:37
 */

/**
 *
 * @author jw
 */
public class TestFrame extends javax.swing.JFrame {

    /** Creates new form TestFrame */
    public TestFrame() {
        initComponents();
        jTable1.getColumnModel().getColumn(0).setCellEditor(new TestEditor());
        jTable1.addKeyListener(new KeyListener(){

            public void keyTyped(KeyEvent ke) {
              
            }

            public void keyPressed(KeyEvent ke) {
              
            }

            public void keyReleased(KeyEvent ke) {
               ((TestEditor)(jTable1.getCellEditor(0,0 ))).txtField.selectAll();
                ((TestEditor)(jTable1.getCellEditor(0,0 ))).txtField.requestFocus();
                ((TestEditor)(jTable1.getCellEditor(0,0 ))).txtField.setText(""+ke.getKeyChar());
               ke.consume();
            }

        });

    }
   
    public class TestEditor extends AbstractCellEditor implements TableCellEditor {

    private static final long serialVersionUID = 1L;

    String originalValue;

    JButton btnMore = new JButton();
    JTextField txtField = new JTextField();
    JComponent component = new JPanel();

   

    public TestEditor() {

        btnMore.setText("...");
        btnMore.setPreferredSize(new Dimension(20, 8));
        btnMore.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                /*ArticleSelectionDialog dlg = new ArticleSelectionDialog("Wählen Sie einen Artikel aus der Liste");
                int result = dlg.showDialog();
                if(result > 0)
                {
                    txtField.setText(dlg.getArtikelnr());
                }*/
            }
        });

        txtField.requestFocus();

        component.setLayout(new BorderLayout());
        component.add(txtField, BorderLayout.CENTER);
        component.add(btnMore, BorderLayout.EAST);
        txtField.addMouseListener(new MouseAdapter(){
                @Override
            public void mouseReleased(MouseEvent e){
                txtField.selectAll();
            }
        });

    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
        originalValue = value.toString();
        txtField.setText(originalValue);
        
        return component;
    }

    @Override
    public Object getCellEditorValue() {
             return txtField.getText();


    }
}

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {"123", null, null, null},
                {"12344", null, null, null},
                {"123123123", null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(15, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(25, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration

}
 
Zurück