ein "JLabel" mit Doppelklick editieren.

Status
Nicht offen für weitere Antworten.

Go

Mitglied
Hallo, ich bin noch ein Java-Anfänger, dennoch würde ich folgendes realisieren:

im Normalzustand ist ein Bedienelement äußerlich kaum von JLabel zu unterscheiden,
durch ein Doppelklick wird dieser zum JTextField und kann editiert werden. Durch das
Drücken von Enter wird die Änderung wirksam, durch das Drücken von ESC oder
Woandersklicken verworfen. Natürlich möchte ich ein Dutzend solcher Elemente im
Frame haben.

So wie ich es mir überlegt habe, wird es mit JTextField und seinen Methoden
setOpaque(false) und setBorder(BorderFactory.createEmptyBorder()) klappen.
Nun, mit Listener kenne ich mich noch nicht gut aus, da würde ich für ein paar gute
Ratschläge sehr dankbar sein.

Ausserdem google ich nach Beispielen, denn das sollte ja eigentlich nicht etwas
außergewöhnliches sein, und bis jetzt habe ich eins gefunden, was halbwegs passt,
es ändertet die Tabnamen in JtabbedPane. hier das Beispiel. ich konnte es aber
nicht nach meinen Wünschen umbauen.
 

eRaaaa

Top Contributor
hi, also du musst ein mouselistener an das label hängen.
ClickCount()==2 -> doppelklick.
Hier ein einfaches beispiel. bei doppelklick wird ein inputdialog geöffnet wo der text für das label eingetragen werdne kann, wie du das dann umsetzt ist dir überlassen ;D

Java:
label.addMouseListener(new MouseAdapter() {

			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2) {
					String s = (String) JOptionPane.showInputDialog("Eingabe:");

					if ((s != null) && (s.length() > 0)) {
						label.setText(s);
						return;
					}
				}

			}
		});
 
Zuletzt bearbeitet:

Go

Mitglied
Danke schön, ich hab jetzt folgendes ausprobiert:
Java:
	JTextField editableLabel = new JTextField();
	editableLabel.setOpaque(false);
    	editableLabel.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent e) {
				// TODO Auto-generated method stub
				((JTextField) e.getSource()).setBorder(BorderFactory.createEmptyBorder());
				((JTextField) e.getSource()).setOpaque(false);
			}
			
			@Override
			public void focusGained(FocusEvent e) {
				// TODO Auto-generated method stub
				((JTextField) e.getSource()).setBorder(BorderFactory.createBevelBorder(1));
				((JTextField) e.getSource()).setOpaque(true);
			}
		});

Das ist ein guter Anfang, aber wie könnte man das schöner machen? also z.B. von JTextField erben und dieses Verhalten in eine neue Elementenart implementieren und nur Instanzen von diesen Element benutzen. und kann man überhaupt Listener in die Elementenimplementation einführen? . und wie realisiert man effizient Eingabeanbruch mit der darauf folgender Herstellung des alten Wertes? (erste Idee, falls man schon ein JTextField erweitert, dann noch irgendein Klassenmember einführen und darein speichern)
 

Go

Mitglied
hab jetzt was passendes gemacht, ich implementierte einen eigenen Listener:

TextFieldEditListener.java
Java:
import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BorderFactory;
import javax.swing.JTextField;

public class TextFieldEditListener extends MouseAdapter implements FocusListener, KeyListener{

	@Override
	public void focusGained(FocusEvent e) {
	}

	@Override
	public void focusLost(FocusEvent e) {
		endEdit((JTextField) e.getSource());
	}
	
	public void mouseClicked(MouseEvent e) {
		if(e.getClickCount()==2) {				     				    
			startEdit((JTextField) e.getSource());
		}
	}

	//Bereite das JTextField vor und speichere den alten Text
	void startEdit(JTextField j){
		((EditableLabel)j).saveOldText();
		j.setBorder(BorderFactory.createLineBorder(Color.black));
		j.setOpaque(true);
		j.setEditable(true);
	}

	//Routine die den alten Wert des JTextField wiederherstellt.
	void cancelEdit(JTextField j){
		j.setText(((EditableLabel)j).getOldText());
		endEdit(j);
	}

	// JTextField wird unscheinbar gemacht.
	void endEdit(JTextField j)	{
		j.setBorder(BorderFactory.createEmptyBorder());
		j.setOpaque(false);
		j.setSelectionEnd(0);
		j.setEditable(false);	
	}

	@Override
	public void keyPressed(KeyEvent e) {
		 if(e.getKeyCode()==KeyEvent.VK_ENTER) {
			 endEdit((JTextField) e.getSource());
		 }else if(e.getKeyCode()==KeyEvent.VK_ESCAPE) {
		         cancelEdit((JTextField) e.getSource());
	     }
	}

	@Override
	public void keyReleased(KeyEvent e) {		
	}

	@Override
	public void keyTyped(KeyEvent e) {
	}
}


die JTextField werden durch Doppelklick aktiv, und durch Fokusverlust wieder passiv. es funktionieren das Verlassen des JTextField durch Enter und das Abrechen durch ESC. Dafür bastelte ich eine neue Klasse, die von JTextField erbte und ein String-Member für den alten Wert bereithält.

EditableLabel.java
Java:
import javax.swing.BorderFactory;
import javax.swing.JTextField;

public class EditableLabel extends JTextField {

	private String oldText;
	
	public EditableLabel()
	{	
		super();
		init();
	}

	public EditableLabel(String string) {
		super(string);
		init();
	}
	
	void init()
	{
		setBorder(BorderFactory.createEmptyBorder());
		setOpaque(false);
		setEditable(false);
		String oldValue = new String();
				
	}

	public String getOldText() {
		return oldText;
	}

	public void setOldText(String oldText) {
		this.oldText = oldText;
	}
	
	public void saveOldText() {
		this.oldText = this.getText(); // ich habe ein Gefühl, dass das so nicht koscher ist.
	}

}


Es kommen einige Seiteneffekte wie z.B. das Fehlen des Cursors und durch ein Weg-Klick (also auf irgendwas, was nicht das aktive Element ist) verliert mein JTextField nicht den Fokus.

hier die GUI zum Testen:
TestEditableLabel.java
Java:
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestEditableLabel extends JFrame{

	TestEditableLabel(){
	
	JTextField editableLabel1 = new EditableLabel("eins     ");
	JTextField editableLabel2 = new EditableLabel("zwo      ");
	JTextField editableLabel3 = new EditableLabel("drei     ");
	JTextField editableLabel4 = new EditableLabel("vier     ");
	
	TextFieldEditListener myTextFieldEditListener = new TextFieldEditListener();
	
	editableLabel1.addFocusListener(myTextFieldEditListener);
	editableLabel2.addFocusListener(myTextFieldEditListener);
	editableLabel3.addFocusListener(myTextFieldEditListener);
	editableLabel4.addFocusListener(myTextFieldEditListener);
	
	editableLabel1.addKeyListener(myTextFieldEditListener);
	editableLabel2.addKeyListener(myTextFieldEditListener);
	editableLabel3.addKeyListener(myTextFieldEditListener);
	editableLabel4.addKeyListener(myTextFieldEditListener);
	
	editableLabel1.addMouseListener(myTextFieldEditListener);
	editableLabel2.addMouseListener(myTextFieldEditListener);
	editableLabel3.addMouseListener(myTextFieldEditListener);
	editableLabel4.addMouseListener(myTextFieldEditListener);	
	
	JPanel A = new JPanel();
	A.setBackground(Color.gray);
	
	A.add(editableLabel1);
	A.add(editableLabel2);
	A.add(editableLabel3);
	A.add(editableLabel4);
	
	add(A);
	
	setSize(400,400);
    setLocationRelativeTo(null);
    setVisible(true);
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    pack();
	}
	
	public static void main(String[] args) {
		TestEditableLabel a = new TestEditableLabel();
	}

}

Außerdem bin ich noch ein Java-Noob und fühle, dass ich das Ganze nicht optimal gemacht habe, und da habe ich noch einige Fragen:
  • ist das ok, dass ich einige Male in TextFieldEditListener die JTextField caste und nicht mit EditableLabel arbeite?
  • die Methode saveOldText() aus EditableLabel verwendet eine Stringzuweisung, ist das so nicht böse?
  • wie bekomme ich die Seiteneffekte los?
  • kann man Adapter implementieren damit ich in TextFieldEditListener diese vielen leeren Methoden los werde?
  • was kann man optimieren?

ps: sorry, dass es alles nicht kommentiert ist
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C Swing Übergabe von String an JLabel AWT, Swing, JavaFX & SWT 9
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
D JLabel übereinanderlegen AWT, Swing, JavaFX & SWT 5
E JLabel kopieren AWT, Swing, JavaFX & SWT 31
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
J Swing JLabel Verknüpfung aktualisieren AWT, Swing, JavaFX & SWT 3
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
F JLabel mit ImageIcon per Button bewegen AWT, Swing, JavaFX & SWT 4
H String teilen, damit bei JLabel keine Punkte am Ende angezeigt werden AWT, Swing, JavaFX & SWT 4
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
E JLabel AWT, Swing, JavaFX & SWT 1
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
I JLabel neue Zeile AWT, Swing, JavaFX & SWT 4
L JLabel ist verzerrt/größer als eingestellt AWT, Swing, JavaFX & SWT 15
B Observer Pattern JLabel ändern AWT, Swing, JavaFX & SWT 7
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
E Wie kann ich ein JLabel auf größe der schriftlänge setzten? AWT, Swing, JavaFX & SWT 2
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L Kalendar als JLabel einfügen AWT, Swing, JavaFX & SWT 3
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
it_is_all jLabel.setText -> Char in Str: NullpointerException AWT, Swing, JavaFX & SWT 1
4 Swing JLabel wird ,,abgehackt" AWT, Swing, JavaFX & SWT 3
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
P Aktualisierung von jLabel in jFrames AWT, Swing, JavaFX & SWT 8
DaCrazyJavaExpert Swing JLabel Klickanimation AWT, Swing, JavaFX & SWT 4
A Swing JLabel als Parameter übergeben AWT, Swing, JavaFX & SWT 9
M JLabel ausrichten AWT, Swing, JavaFX & SWT 2
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
T JLabel Textinhalt von Oben anzeigen AWT, Swing, JavaFX & SWT 1
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
Thallius Swing "..." beim JLabel verhindern? AWT, Swing, JavaFX & SWT 3
OlafHD JLabel im JFrame Zentrieren AWT, Swing, JavaFX & SWT 2
T Event Handling JLabel als eigener Button AWT, Swing, JavaFX & SWT 7
T JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
F Abgeleitetes JLabel AWT, Swing, JavaFX & SWT 16
D Swing keine JLabel-Aktualisierung bei "externem" Aufruf durch Helferklasse AWT, Swing, JavaFX & SWT 10
S jLabel HTML Formatierung AWT, Swing, JavaFX & SWT 2
J Statisches JLabel adden AWT, Swing, JavaFX & SWT 4
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
T JLabel in die Mitte(JLabel.CENTER geht nicht) AWT, Swing, JavaFX & SWT 12
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
K Swing unterschied JTextField und JLabel AWT, Swing, JavaFX & SWT 7
F Swing JLabel in JFrame anpassen AWT, Swing, JavaFX & SWT 20
E JLabel aus Runnable ändern AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D JLabel bei Aufruf neue Zeile AWT, Swing, JavaFX & SWT 5
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
F Swing JLabel wird nicht sofort Angezeigt AWT, Swing, JavaFX & SWT 3
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
GreyFox JLabel in laufender Anwendung erzeugen AWT, Swing, JavaFX & SWT 6
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
Z Auf ein JLabel drauf malen? AWT, Swing, JavaFX & SWT 1
S JLabel in den Vordergrund rücken AWT, Swing, JavaFX & SWT 1
A JLabel hochzählen lassen. AWT, Swing, JavaFX & SWT 6
S JLabel mit ImageIcon, komischer Rahmen? AWT, Swing, JavaFX & SWT 2
I Swing JLabel Bild für 1sec anzeigen lassen AWT, Swing, JavaFX & SWT 13
S JLabel anordnen AWT, Swing, JavaFX & SWT 2
J ungewollt-automatische Größenänderung von JLabel AWT, Swing, JavaFX & SWT 5
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
L 2D-Grafik PNG Datei in JLabel Array Problem AWT, Swing, JavaFX & SWT 4
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
B Swing JLabel und LayoutManager AWT, Swing, JavaFX & SWT 20
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
A Swing JLabel/JTextField Inhalt mit JSlider verändern AWT, Swing, JavaFX & SWT 12
O Statusleiste mit JLabel aktualisieren AWT, Swing, JavaFX & SWT 5
G jLabel aus anderem Fenster ändern AWT, Swing, JavaFX & SWT 7
T JLabel Nullpunkt verschieben AWT, Swing, JavaFX & SWT 6
F Swing JPanel mit JLabel spinnt? AWT, Swing, JavaFX & SWT 2
M Massenweise JLabel ? oder ? AWT, Swing, JavaFX & SWT 3
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
N JLabel HTML mit custom Font AWT, Swing, JavaFX & SWT 0
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
G JLabel verdeckt AWT, Swing, JavaFX & SWT 12
A JLabel zeichendicke einstellen AWT, Swing, JavaFX & SWT 3
B Repaint auf JFrame, JLabel und ImageIcon AWT, Swing, JavaFX & SWT 4
S JLabel zeigt ImageIcon nicht AWT, Swing, JavaFX & SWT 13
S jLabel / jText beim starten ausblenden AWT, Swing, JavaFX & SWT 2
A Array von JLabel mit Grafiken anzeigen AWT, Swing, JavaFX & SWT 3
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
A JLabel im Listener färben AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
T Kreis in Jlabel darstellen. AWT, Swing, JavaFX & SWT 13
SexyPenny90 JLabel liegt unter meiner Turtle AWT, Swing, JavaFX & SWT 5
V JLabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben