# Eigene Komponenten basteln



## Mark110 (15. Jul 2008)

Ich frage mich gerade wie man eigene Komponenten basteln kann?


----------



## SlaterB (15. Jul 2008)

mit einer Tastatur und noch einigem anderen


----------



## Mark110 (15. Jul 2008)

die frage ist wohl schlecht gestellt, wie man an der ironie erkennt  aber ich kenne nur die fertigen komponenten die ich mti new erstelle. ich habe keine vorstellung wie ich sowas mit individuellen dingen machen kann?


----------



## The_S (15. Jul 2008)

Meinst du einfach nur eigene Klassen, oder Swing/AWT/SWT-Komponenten!?


----------



## Mark110 (15. Jul 2008)

letzteres


----------



## The_S (15. Jul 2008)

Nunja, da gibt es zum Einen die Methode eine eigene Komponente mit anderen Komponenten zu erweitern => z. B. eine eigene Klasse, die von JPanel erbt und mehrere andere Komponenten in sich zu einer großen Komponente zusammenfasst. Oder aber du zeichnest dir etwas komplett neues über die paintComponent-Methode selbst.


----------



## Mark110 (15. Jul 2008)

```
import javax.swing.JFrame;
import javax.swing.JTextArea;


public class EigeneKom extends JTextArea{
	
	

}


class Test extends JFrame{
	
	
	
	
	public static void main(String[] args) {
		System.out.println("dd");
		Test t = new Test();
		t.setDefaultCloseOperation(EXIT_ON_CLOSE);
		t.setBounds(200,200,200,200);
		t.getContentPane().add(new EigeneKom());
		t.setVisible(true);
	}
}
```

und wie kann ich jetzt z.b. irgendwas individuelles rein machen?


----------



## The_S (15. Jul 2008)

Einfach reinschreiben!? Ich glaub bei dir liegt ein grundsätzliches Verständnisproblem vor  . Evtl. sagst du uns mal, wie du jetzt z. B. deine JTextArea verändert haben möchtest (was einfaches, kleines für den Anfang) und wir/ich zeigen dir, wies geht.


----------



## Michael... (15. Jul 2008)

was soll denn individuelles rein?


----------



## Mark110 (15. Jul 2008)

naja ist halt nen scheiss beispiel 
mir fällt gerade nicht ein was so eine textarea noch machen können soll 

aber sagen wir z.b. so eine dropdownliste wie würde ich sowas schrieben.

würde ich da ein jtextfield ableiten?


----------



## The_S (16. Jul 2008)

Hiet etwas ähnliches und älteres von mir:

http://www.java-forum.org/de/viewtopic.php?t=30628&highlight=jtextfield

Ich hoffe es erfüllt deine Wünsche 

Zum Thema "Was ein TextArea noch machen können soll": Wie wärs mit nem standardmäsig implementierten JPopupMenu für Standardaktionen wie Copy, Paste, Cut, ...!?


----------



## JALU (17. Jul 2008)

Ich habe das ganze mal gebastelt, aber ich weiß nicht ob sauber ist alle Konstruktoren neu zu erzeugen?
Vielleicht kann man das noch sauberer lösen.

Hier mein Code:


```
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTextArea;
import javax.swing.text.Document;

public class JTextAreaWithMenu extends JTextArea implements MouseListener {
	private static final long serialVersionUID = 6872048458970699373L;
	
	private JPopupMenu popmen = new JPopupMenu(); 
	private JMenuItem menu1 = new JMenuItem( "Ausschneiden"); 
	private JMenuItem menu2 = new JMenuItem( "Kopieren"); 
	private JMenuItem menu3 = new JMenuItem( "Einfügen"); 
	private JMenuItem menu4 = new JMenuItem( "Löschen"); 
	private JMenuItem menu5 = new JMenuItem( "Alles Markieren"); 

	private ActionListener menuListener = new ActionListener() {
		public void actionPerformed(ActionEvent event) {
			if(event.getActionCommand().equals("Ausschneiden")) {
				try {
					Robot rob = new Robot(); 
					rob.keyPress( KeyEvent.VK_CONTROL ); 
					rob.keyPress( KeyEvent.VK_X );
					rob.keyRelease(KeyEvent.VK_CONTROL);
					rob.keyRelease(KeyEvent.VK_X);
				}
				catch(AWTException awtE){}
			} else if(event.getActionCommand().equals("Kopieren")) {
				try {
					Robot rob = new Robot(); 
					rob.keyPress( KeyEvent.VK_CONTROL ); 
					rob.keyPress( KeyEvent.VK_C );
					rob.keyRelease(KeyEvent.VK_CONTROL);
					rob.keyRelease(KeyEvent.VK_C);
				}
				catch(AWTException awtE){}
			} else if(event.getActionCommand().equals("Einfügen")) {
				try {
					Robot rob = new Robot(); 
					rob.keyPress( KeyEvent.VK_CONTROL ); 
					rob.keyPress( KeyEvent.VK_V );
					rob.keyRelease(KeyEvent.VK_CONTROL);
					rob.keyRelease(KeyEvent.VK_V);
				}
				catch(AWTException awtE){}
			} else if(event.getActionCommand().equals("Löschen")) {
				try {
					Robot rob = new Robot(); 
					rob.keyPress( KeyEvent.VK_DELETE ); 
					rob.keyRelease(KeyEvent.VK_DELETE);
				}
				catch(AWTException awtE){}
			} else if(event.getActionCommand().equals("Alles Markieren")) {
				try {
					Robot rob = new Robot(); 
					rob.keyPress( KeyEvent.VK_CONTROL ); 
					rob.keyPress( KeyEvent.VK_A );
					rob.keyRelease(KeyEvent.VK_CONTROL);
					rob.keyRelease(KeyEvent.VK_A);
				}
				catch(AWTException awtE){}
			}
		}
	};

	public JTextAreaWithMenu() {
		super();
		this.addMouseListener(this);
		setJPopupMenu();	
	}
	
	public JTextAreaWithMenu(Document doc) {
		super(doc);
		this.addMouseListener(this);
		setJPopupMenu();	
	}
	
	public JTextAreaWithMenu(Document doc, String text, int rows, int columns) {
		super(doc, text, rows, columns);
		this.addMouseListener(this);
		setJPopupMenu();	
	}
	
	public JTextAreaWithMenu(int rows, int columns) {
		super(rows, columns);
		this.addMouseListener(this);
		setJPopupMenu();	
	}
	
	public JTextAreaWithMenu(String text) {
		super(text);
		this.addMouseListener(this);
		setJPopupMenu();	
	}
	
	public JTextAreaWithMenu(String text, int rows, int columns) {
		super(text, rows, columns);
		this.addMouseListener(this);
		setJPopupMenu();	
	}
	
	
	private void setJPopupMenu() {
		menu1.addActionListener(menuListener);
		menu2.addActionListener(menuListener);
		menu3.addActionListener(menuListener);
		menu4.addActionListener(menuListener);
		menu5.addActionListener(menuListener);

		popmen.add( menu1 ); 
		popmen.add( menu2 ); 
		popmen.add( menu3 );
		popmen.add( menu4 );
		popmen.addSeparator();
		popmen.add( menu5 );
	}

	@Override
	public void mouseClicked(MouseEvent me) {
		if(me.getButton()==MouseEvent.BUTTON3) {
			popmen.show( this, me.getX(), me.getY() ); 
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {}

	@Override
	public void mouseExited(MouseEvent arg0) {}

	@Override
	public void mousePressed(MouseEvent arg0) {}

	@Override
	public void mouseReleased(MouseEvent arg0) {}
}
```


----------



## SlaterB (17. Jul 2008)

wenn du in deinem Programm nur einige wenige der Konstruktoren brauchst,
dann kannst du die anderen weglassen, man kann sie eh nicht aufrufen, wenn nicht von dir neu definiert (keine normale Vererbung),

--------

die Aufrufe
this.addMouseListener(this); 
      setJPopupMenu(); 
könntest du erstens noch in eine Operation init() zusammenfassen statt sie immer beide aufzurufen
und zweitens solltest du einheitlich bei beiden this. schreiben oder bei gar keinem

-------

statt
> if(event.getActionCommand().equals("Ausschneiden")) { 
geht wahrscheinlich auf
if(event.getSource() == menu1) { 

-----

den Robot musst du vielleicht nicht pro Aktion neu erzeugen sondern kannst ihn längerfristig speichern,
in jedem Fall würde eine Zeile am Anfang der actionPerformed reichen,
auch das try/catch nicht 5x wiederholen, sondern nur einmal, das if/ else dann darin


----------



## The_S (17. Jul 2008)

Den Robot brauchst du gar nicht, da die JTextArea die Methoden JTextArea#copy JTextArea#paste und JTextArea#cut bereitstellt  .


----------



## Guest (17. Jul 2008)

Und wie spreche ich die Klasse an? this funktioniert ja nicht, da der Code in dem ActionListener ist.
Muss ich am Anfang schreiben:


```
JTextArea jta=this;
```


----------



## The_S (17. Jul 2008)

Fränkisches Fragewort mit 2 Buchstaben: HÄ!?


----------



## ARadauer (17. Jul 2008)

JTextAreaWithMenu asldfkjasf = new JTextAreaWithMenu ();


----------



## Verjigorm (17. Jul 2008)

Im Actionlistener anstatt this -> Klassenname.this


----------



## Guest (17. Jul 2008)

Ok schlecht gestellte Frage  

Das hier funktioniert nicht:


```
private ActionListener menuListener = new ActionListener() {
		public void actionPerformed(ActionEvent event) {
			try {
				Robot rob=new Robot();

				if(event.getSource() == cut) {
					this.cut(); //geht nicht
				}
				if(event.getSource() == copy) {
					rob.keyPress( KeyEvent.VK_CONTROL ); 
					rob.keyPress( KeyEvent.VK_C );
					rob.keyRelease(KeyEvent.VK_CONTROL);
					rob.keyRelease(KeyEvent.VK_C);
				}
				if(event.getSource() == paste) {
					rob.keyPress( KeyEvent.VK_CONTROL ); 
					rob.keyPress( KeyEvent.VK_V );
					rob.keyRelease(KeyEvent.VK_CONTROL);
					rob.keyRelease(KeyEvent.VK_V);
				}
				if(event.getSource() == delete) {
					rob.keyPress( KeyEvent.VK_DELETE ); 
					rob.keyRelease(KeyEvent.VK_DELETE);
				}
				if(event.getSource() == mark) {
					rob.keyPress( KeyEvent.VK_CONTROL ); 
					rob.keyPress( KeyEvent.VK_A );
					rob.keyRelease(KeyEvent.VK_CONTROL);
					rob.keyRelease(KeyEvent.VK_A);
				}
			}
			catch(AWTException awtE){}
		}
	};
```

Wie ist die Lösung?


----------



## The_S (17. Jul 2008)

1.) keine inneren Klassen verwenden, oder
2.) siehe Verjigorm


----------



## Guest (17. Jul 2008)

Ok lösung von Verjigorm funktioniert, aber wie kann ich den da keine inneren Klasse verwenden?


----------



## The_S (17. Jul 2008)

Indem du deine JTextArea Klasse einfach den ActionListener implementieren lässt anstelle.


----------



## Guest (17. Jul 2008)

Ich möchte ein Login Fenster basteln. Das ganze soll statisch sein und ein boolean liefern.

Jetzt habe ich wieder ein Problem mit dem ActionListener da ich von da kein return benutzen kann:


```
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class JLoginWindow {

	private static JFrame frame=new JFrame("Passwortabfrage");
	private static JLabel text=new JLabel("Passwort hier eingeben:");
	private static JTextField eingabe=new JTextField();
	private static JButton zugang=new JButton("Eingabe");

	public static void show(final String passwort) {

		frame.setSize(500,130);
		frame.setLocation(100,100);
		frame.setLayout(new GridLayout(3,1,5,5));

		ActionListener al = new ActionListener() {
			public void actionPerformed(ActionEvent actionEvent) {
				new Thread() { 
					@Override public void run() {
						zugang.setEnabled(false);
						
						if(text.getText().equals(passwort))
							return true; //geht nicht
						else {
							text.setText("");
							zugang.setEnabled(false);
							Thread.sleep(100);
							zugang.setEnabled(true);
							return false; //geht nicht
						}
					}
				}.start();
			}
		};
		eingabe.addActionListener(al);
		
		frame.add(text);
		frame.add(eingabe);
		frame.add(zugang);

		frame.setVisible(true);
	}
}
```


----------



## SlaterB (17. Jul 2008)

selbst wenn es einen Rückgabewert gäbe, brächte dir das nix, 
denn du rufst die Operation ja nie auf, das macht der User wenn er irgendwo klickt,
wo sollte dann der Rückgabewert hinwandern?

anderseits gibts das schon, schau dir JOptionPane an

deine true/ false könntest du kurzfristig in einer Exemplarvariablen zwischenspeichern,
ach ne, anonyme innere Klasse + static Operation, du machst es ja besonders schwer,
na ich mag das nun nicht komplett erklären,
schaue dir JOptionPane an, das hilft evtl. schon weiter


----------



## Guest (18. Jul 2008)

JOptionPane hilft mir nicht weiter, da ich es nicht verstehe.
Gibts da vielleicht einen Link , wo's erkläert wird?


----------



## SlaterB (18. Jul 2008)

http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html


----------

