Buttons/Schaltfläche aktivieren/deaktivieren

MaBiGiga

Grünschnabel
lis ist höchstwahrscheinlich der java.awt.event.KeyListener, swt Elementen wie deinem txtDescrip kannst da aber nur Keylistener vom Typ org.eclipse.swt.events.KeyListener hinzufügen.
Dieser Ausdruck in Klammern bedeutet, dass du den awt-Keylistener zum swt-KeyListener castest.
Der Compiler ist damit zufrieden, obs zur Laufzeit eine Classcast-Exception gibt, weiß ich jetzt nicht.

Du solltest aber wirklich weg von dem Mix SWT-Swing kommen.

Entscheide dich, entweder die GUI mit nem SwingBuilder bauen, oder den SWT-Keylistener implementieren, aber nicht SWT elemente zusammen mit dem Swing-Keylistener verwenden.
 

sauerpeter

Grünschnabel
Ich dachte ich hätte Swing-Komponenten jetzt schon minimiert.
Wie ist denn der Unterschied zwischen Swing-KeyListener und SWT-KeyListener?
Danke!
 

Akeshihiro

Erfahrenes Mitglied
Der Unterschied ist egal, das sind einfach nicht die gleichen Interfaces, nicht mal wenn die Methoden genau gleich wären. Es wird daher sogar mit Sicherheit knallen.

Entscheide dich einfach für ein Framework, entweder Swing oder SWT. Dann kann man da auch besser bei helfen, da man dann gezielt für das eine Framework hinarbeiten kann. Das ist jetzt grad irgend nen Kauderwelsch ...

EDIT:
Btw wie bist du überhaupt auf SWT gekommen? Wenn ich deine Posts so lese, dann würde ich mal behaupten, dass du ein Anfänger bist. Da kommt man normalerweise nicht auf SWT.
 
Zuletzt bearbeitet:

I2oxxi

Mitglied
Java:
        btnCommit = new JButton();
das J nicht vergessen ... ebenso wenig das ;
Für den KeyListener muss du andere Objekte nehmen.
Nimm mal JButtons und JTextArea und JLabel...
Also Swing. Mit den JTextArea wird der KeyListener funktionieren.
Du solltes dir den Code den ich dir zusammengestellt habe schon richtig durchlesen.
Die Listen Methode sollte auch nur den KeyListener erstellen und diesen hinzufügen, der Button sollte in init() erstellt werden (oder halt da wo du auch alles andere erstellst, ich machs halt immer wie im Beispiel, angewohnheit), du mixxt unnötig Sachen und versaust dir dadurch irgendwann selber den Überblick
 
Zuletzt bearbeitet:

sauerpeter

Grünschnabel
Ok, ich habe meine Fehler gefunden.
Das es jetzt noch funktioniert und der Button aktiv wird, wenn was im Feld steht, muss die Methode probe aufgerufen werden.

Kann das auch innerhalb der Datei oder muss man immer explizit eine main haben?

Hier mal die Methode probe:
Java:
public void probe()
    {
        KeyListener lis = new KeyListener(){
        	
        	@Override
            public void keyReleased(KeyEvent e)
            {
                if (txtDescrip.getText().equals(""))
                {
                	btnCommit.setEnabled(false);
                }
                else
                {
                	btnCommit.setEnabled(true);
                }
 
            }
        	
            
            @Override
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub
                
            }
            
        };
        
        txtDescrip.addKeyListener(lis);
 

Akeshihiro

Erfahrenes Mitglied
Benutze bitte die entsprechenden Tags zur Code-Darstellung. Für Java wären diese [code=java][/code].

Und hier mal ein funktionierendes Beispiel mit SWT.
Java:
package test.gui.swt;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

@SuppressWarnings("javadoc")
public class SwtTest implements KeyListener {
	protected Shell	shell;
	private Button	btnSenden;
	private Text	text;
	private Text	text_1;

	/**
	 * Launch the application.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			SwtTest window = new SwtTest();
			window.open();
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Open the window.
	 */
	public void open() {
		Display display = Display.getDefault();
		createContents();
		shell.open();
		shell.layout();
		while(!shell.isDisposed()) {
			if(!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}

	/**
	 * Create contents of the window.
	 */
	protected void createContents() {
		shell = new Shell();
		shell.setSize(275, 80);
		shell.setText("SWT Application");

		btnSenden = new Button(shell, SWT.NONE);
		btnSenden.setBounds(174, 10, 75, 25);
		btnSenden.setText("Senden");

		text = new Text(shell, SWT.BORDER);
		text.setBounds(10, 12, 76, 21);
		text.addKeyListener(this);

		text_1 = new Text(shell, SWT.BORDER);
		text_1.setBounds(92, 12, 76, 21);
		text_1.addKeyListener(this);

		validateFormular();
	}

	private void validateFormular() {
		btnSenden.setEnabled(!text.getText().trim().isEmpty() && !text_1.getText().trim().isEmpty());
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// nothing to do
	}

	@Override
	public void keyReleased(KeyEvent e) {
		validateFormular();
	}
}
 

I2oxxi

Mitglied
ja, die Methode probe könntes du z.B. am Ende der gui aufrufen, also nach setVisible(true);
Schau dir doch bitte einfach die Beispiele richtig an, da ist alles klar strukturiert und gut erkennbar ...
 

sauerpeter

Grünschnabel
Ja ok, hast recht. Einfach besser gucken:rolleyes::rolleyes:
Jetzt funktioniert es, hatte auch ganze Zeit falsch deklariert :(

Schwere Geburt, aber danke für eure Geduld.
Letztes Mal programmiert habe ich glaube 2009 und da leider auch nur grundlagenmäßig :(:(:(
Ich weiß, man merkts..

Aber jetzt soll es wieder losgehen ;-);-) Die Synapsen müssen aber erst wieder zueinander finden.
 
Zuletzt bearbeitet:

sauerpeter

Grünschnabel
Eine neue Frage dazu:

Wie kann ich diese Methode jetzt weitervererben an anderer Stelle, so das ich nicht doppelten Code habe?

Code:
public void listen()
    {
        KeyListener li = new KeyListener(){
        	
        	@Override
            public void keyReleased(KeyEvent e)
            {
        		fDirty = true;
                firePropertyChange(PROP_DIRTY);
        		if (txtField.getText().equals(""))
                {
                	btn1.setEnabled(false);
                }
                else
                {
                	btn1.setEnabled(true);
                }
 
            }
        	
            
            @Override
            public void keyPressed(KeyEvent e) {
                // TODO Auto-generated method stub
                
            }
            
        };
        
        txtField.addKeyListener(li);
    }

Ein Button an anderer Stelle soll genau das gleiche tun. Muss ich dann eine neue Methode implementieren und diese listen-Methode mit extends erweitern?
Aber wie geschieht dann die Übergabe der Parameter?
 

I2oxxi

Mitglied
wenn er genau das gleiche machen soll dann implementiere doch einfach KeyListener (das Interface), also schreib dir einen eigenen KeyListener der dann in seinen KeyRealesed etc genau das tut ...

Java:
import java.awt.event.*;

import javax.swing.*;


public class BspListener implements KeyListener {
	
	JButton button;
	JTextField text;
	
	public BspListener(JButton button, JTextField text)
	{
		this.button=button;
		this.text=text;
		text.addKeyListener(this);
		
		if(text.getText().equals(""))
			button.setEnabled(false);
	}
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyReleased(KeyEvent e) {
        if (text.getText().equals(""))
        {
            button.setEnabled(false);
        }
        else
        {
            button.setEnabled(true);
        }
		
	}
}

der würde sich selbs auch als listener hinzufügen, also einfach in deiner GUI
Java:
BspListener b = new BspListener(DEIN_BUTTON,DEIN_TEXTFELD);

Beispiel:
Java:
import javax.swing.*;


public class BspGui extends JFrame{
	
	JButton button;
	JTextField text;
	
	public BspGui()
	{
		super("Test");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(null);
		this.setBounds(200,200,200,200);
		
		text = new JTextField();
		text.setBounds(10,10,160,30);
		this.getContentPane().add(text);
		
		button = new JButton("Klick mich");
		button.setBounds(10,50,160,30);
		this.getContentPane().add(button);
		
		BspListener b = new BspListener(button,text);
		
		this.setVisible(true);
		
	}
	
	public static void main(String[] args)
	{
		BspGui b = new BspGui();
	}

}

könntes natürlich die "automatische listeneraufnahme" im listener selber löschen und in der gui dann in diesem fall text.addKeyListener(b) machen
 
Zuletzt bearbeitet: