Swing JTextComponent markieren bei Änderungen

dbausnnd

Aktives Mitglied
Hallo Ich möchte einen Decorator bauen der Text Komponenten markiert wenn sich der Wert durch den Benutzer ändert. Der Basiswert wird aus der Datenbank gelesen. Sobald der Benutzer eine Änderung durchführt, soll diese erkenntlich gemacht werden. Sollte der Basiswert durch eine Änderung vom Benutzer wieder hergestellt werden, soll die Komponenten wieder im ursprünglichen Zustand angezeigt werden. Sobald ein neuer Datensatz aus der DB gelesen wird ist dieser Wert die Basis.

Ich habe bereits mit unterschiedlichen Listenern (KEyboard, Document, PropertyChange) experimentiert. Komme auf keine ordentliche Lösung. Bei Änderungen über Tastatur sowie über die SetText Methode aus dem Code heraus wird der DocumentListener sowie der PropertyChangeListener aufgerufen.

Hat jemand eine Idee wie so etwas gelöst werden kann?

Besten Dank im voraus.

MfG

dbausnnd
 

strußi

Top Contributor
ich hab einen focus-listener auf einem Textfeld und mit focusGain
Java:
@Override
        public void focusGained( FocusEvent e){
//            Auslesen welches objekt der auslößer war
            Object obj =e.getSource();
            if( e.getSource() instanceof JTextField){
//                Den kompletten inhalt des Textfeldes markieren
               (( JTextField) obj).selectAll();
            }
        }
probiers mal aus
 

dbausnnd

Aktives Mitglied
ich hab einen focus-listener auf einem Textfeld und mit focusGain
Java:
@Override
        public void focusGained( FocusEvent e){
//            Auslesen welches objekt der auslößer war
            Object obj =e.getSource();
            if( e.getSource() instanceof JTextField){
//                Den kompletten inhalt des Textfeldes markieren
               (( JTextField) obj).selectAll();
            }
        }
probiers mal aus

Danke erstmal für den Tipp. Meine Anmerkung das ich die Text Komponente markieren will ist vermutlich nicht detailliert genug beschrieben. Mein Ziel ist es wenn in einer Text Komponente der Wert "Hallo Welt" als Basis enthalten ist, soll die Komponente bspw. einen roten Rahmen bekommen sobald der Wert nicht mehr "Hallo Welt" ist. Wenn durch eine Tastatureingabe der Basiswert wieder erreicht ist wird der rote Rahmen entfernt. Der Basiswert sollte aber über setText der Text Komponente abgefangen werden.

Ich hoffe es ist etwas klarer geworten :S
 

X5-599

Top Contributor
Weiss nicht, ob ich dich richtig verstanden habe. Aber ich hab mal ein Beispiel gemacht mit JTextField. Beim Konstruktor Aufruf merkt sich die Komponente den originalen Text und vergleicht dagegen bei jedem neuen setText(). Um einen neuen Original-Text zu setzen muss die Komponente neu erzeugt werden. Vielleicht nicht ganz so, wie du es dir vorgestellt hast, aber das ist das beste was ich so auf die schnelle "zusammenschieben" konnte :)

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.text.JTextComponent;


public class Start
{	
	static class IntelligentJTextField extends JTextField
	{
		private static final long serialVersionUID = -3668530424000681944L;
		
		private String originalText;
		private Border originalBorder;
		public IntelligentJTextField(String text)
		{
			super(null);
			this.originalBorder = getBorder();
			
			this.originalText = text;
			setText(text);
		}
		@Override
		public void setText(String text)
		{
			//is new text equal to original text
			if((text == null && originalText == null) || (text != null && text.equals(originalText)))
			{
				//remove border
				if(!originalBorder.equals(getBorder()))
				{
					System.out.println("remove border");
					setBorder(originalBorder);
				}
			}
			else
			{
				//set border
				System.out.println("set border");
				setBorder(new BevelBorder(BevelBorder.LOWERED, Color.RED, Color.RED));
			}
			
			super.setText(text);
		}
		
	}
	
	public static void main(String[] args)
	{
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run()
			{
				JFrame frame = new JFrame("Test Frame");
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				
				final JTextComponent a = new IntelligentJTextField("Original Text");
				
				JButton b = new JButton("setNewText");
				b.addActionListener(new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent e)
					{
						a.setText("New Text");
						a.revalidate();
						a.repaint();
					}
				});
				JButton c = new JButton("setOriginalText");
				c.addActionListener(new ActionListener() {
					
					@Override
					public void actionPerformed(ActionEvent e)
					{
						a.setText("Original Text");
						a.revalidate();
						a.repaint();
					}
				});
				
				frame.add(b, BorderLayout.NORTH);
				frame.add(a, BorderLayout.CENTER);
				frame.add(c, BorderLayout.SOUTH);
				
				
				frame.pack();
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);				
			}
		});
	}
}
 

dbausnnd

Aktives Mitglied
Das ist eine Lösung indem ich die Komponente erweitere. Meine Idee war jedoch das als Decorator zu verwenden. Die Funktionalität wird an einer JTextComponent angehängt.
 

dbausnnd

Aktives Mitglied
Vielen Dank für die Hilfe.

Ich habe eine Lösung gefunden in dem ich den FocusListener und den PropertyChangeListener kombiniere:

Code:
public class SomeDecorator {
   
    private JTextComponent textComponent;
    private Border originalBorder;
    private Border changedBorder = BorderFactory.createLineBorder(Color.RED);
    private String value;
    private boolean isFocused;
   
    private SomeDecorator(JTextComponent textComponent) {
        this.textComponent = textComponent;
        originalBorder = textComponent.getBorder();
        value = textComponent.getText();
        isFocused = false;
    }

    public static void decorate(final JTextComponent textComponent){
       
        final SomeDecorator decorator = new SomeDecorator(textComponent);
       
        textComponent.addPropertyChangeListener(new PropertyChangeListener() {
           
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if("value".equals(evt.getPropertyName())){
                    String newValue = (evt.getNewValue() == null ? "" : evt.getNewValue().toString());
                    decorator.valueChanged(newValue);
                }
                }
        });
       
        textComponent.addFocusListener(new FocusListener() {
           
            @Override
            public void focusLost(FocusEvent e) {
                decorator.isFocused = false;
            }
           
            @Override
            public void focusGained(FocusEvent e) {
                decorator.isFocused = true;
            }
        });
       
    }

    private void valueChanged(String newValue) {
        if(isFocused){
            if(value.equals(newValue)){
                textComponent.setBorder(originalBorder);
            } else {
                textComponent.setBorder(changedBorder);
            }
        } else{
            value = newValue;
            textComponent.setBorder(originalBorder);
        }
    }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Swing JTextComponent und HTML AWT, Swing, JavaFX & SWT 7
R text offset versus JTextComponent caret position AWT, Swing, JavaFX & SWT 6
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
F Zeile in mehreren Jtables bei Selektion markieren AWT, Swing, JavaFX & SWT 11
P JavaFX TableView Zelle markieren AWT, Swing, JavaFX & SWT 3
J SWT Textfeld markieren und kopieren AWT, Swing, JavaFX & SWT 0
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
Thallius Swing Warum kann man Texte im Panel nicht markieren? AWT, Swing, JavaFX & SWT 1
P Swing JTable mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 1
D Swing Mit TableCellRenderer einzelne Zellen markieren AWT, Swing, JavaFX & SWT 3
M Beim Start von TableEditor Inhalt der Zelle markieren. AWT, Swing, JavaFX & SWT 2
reibi SWT Teilbereich eines Images markieren AWT, Swing, JavaFX & SWT 7
J Swing JTable: Komplette Zeile aber ohne Spalten markieren AWT, Swing, JavaFX & SWT 11
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
A JTable Zelle markieren von bis und Löschen AWT, Swing, JavaFX & SWT 6
C Swing gleiche Einträge in JTable farblich markieren AWT, Swing, JavaFX & SWT 5
Haave Swing Text markieren nach Tabdruck AWT, Swing, JavaFX & SWT 3
D TreeNode farbig markieren AWT, Swing, JavaFX & SWT 2
K JFileChooser mehrere Dateien markieren ohne STRG AWT, Swing, JavaFX & SWT 4
M Markieren von ganzen Zeilen in transparenten Tabellen AWT, Swing, JavaFX & SWT 6
J SWT CCombo Text markieren AWT, Swing, JavaFX & SWT 2
O JCalendar - Tage markieren AWT, Swing, JavaFX & SWT 2
E Zelle in JTable nach klick markieren AWT, Swing, JavaFX & SWT 2
B Swing JTable: mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 3
H Zeich in einem TextField farblich markieren?! AWT, Swing, JavaFX & SWT 5
P DragAndDrop aus JTable ohne vorheriges markieren AWT, Swing, JavaFX & SWT 8
A JXMonthView --> Tage markieren (flaggen) AWT, Swing, JavaFX & SWT 2
G Ganzen Text im Taxtfield markieren AWT, Swing, JavaFX & SWT 3
T [SWT] TreeItem als selektiert markieren AWT, Swing, JavaFX & SWT 2
G JTextfield Inhalt markieren bei Auswahl AWT, Swing, JavaFX & SWT 2
S Welcher Listener ? In JTable mehrere Zeilen markieren & AWT, Swing, JavaFX & SWT 2
G JTextArea u. Wörter darin markieren AWT, Swing, JavaFX & SWT 3
W Zellen Inhalt beim editieren markieren AWT, Swing, JavaFX & SWT 2
V Bei Tab, Zahlen im jTextField markieren. AWT, Swing, JavaFX & SWT 2
A Zellen in JTable auf Klick kurz markieren auf Klick AWT, Swing, JavaFX & SWT 2
W JTree, bei Drag Over über den Knoten "markieren" AWT, Swing, JavaFX & SWT 3
P markieren & kontextmeü mit rechtsklick AWT, Swing, JavaFX & SWT 3
A JFileChooser - Mehrere Dateien per Maus markieren (nokeys) AWT, Swing, JavaFX & SWT 7
G JTable-Zeile/Zelle markieren und mir Shortcut in Arbeitsspei AWT, Swing, JavaFX & SWT 3
A JTable, mehrere Zellen markieren AWT, Swing, JavaFX & SWT 3
D Markieren mit Rectangle ? AWT, Swing, JavaFX & SWT 9
TheJavaKid AWT-Button markieren AWT, Swing, JavaFX & SWT 3
C JTable -> Rechtsklick -> Zeile markieren AWT, Swing, JavaFX & SWT 5
L Ganze Zeile markieren AWT, Swing, JavaFX & SWT 6
N JTable Ganze Zeile markieren AWT, Swing, JavaFX & SWT 8
G TableCellRenderer soll ganze ausgewählte Zeile markieren AWT, Swing, JavaFX & SWT 2
D Jtable farbig markieren - Verständnis Problem AWT, Swing, JavaFX & SWT 5
W Element im JTree farblich markieren AWT, Swing, JavaFX & SWT 6
L JTextField: Kompletten Text bei Selektion markieren AWT, Swing, JavaFX & SWT 5
R JTable Zellen markieren AWT, Swing, JavaFX & SWT 3
B JList Zeilen in verschiedenen Farben markieren. AWT, Swing, JavaFX & SWT 3
T Bildausschnitte markieren AWT, Swing, JavaFX & SWT 14
I einzelne Zellen bei JTable markieren AWT, Swing, JavaFX & SWT 3
N JTable - Problem mit markieren von Zellen AWT, Swing, JavaFX & SWT 3
G Text markieren -> Hyperlink erstellen AWT, Swing, JavaFX & SWT 2
P Inhalt von JTextField beim Auswählen markieren AWT, Swing, JavaFX & SWT 7
G auch mit rechter Maustaste in einer Tabelle markieren? AWT, Swing, JavaFX & SWT 3
P JavaFX Änderungen am Datenmodell visuell nicht sichtbar AWT, Swing, JavaFX & SWT 3
G JTextField Änderungen überprüfen AWT, Swing, JavaFX & SWT 4
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2
G JavaFX TableView - Änderungen werden nicht übernommen. AWT, Swing, JavaFX & SWT 3
S Swing Auf Änderungen eines Models in der View einer JTable reagieren AWT, Swing, JavaFX & SWT 1
X Swing GUI-Änderungen mit invokeLater AWT, Swing, JavaFX & SWT 4
B Row und Cell Änderungen feststellen AWT, Swing, JavaFX & SWT 3
D Änderungen einer Card des CardLayouts zur Laufzeit AWT, Swing, JavaFX & SWT 6
M Swing Änderungen eines TextFelds und JOptionPane AWT, Swing, JavaFX & SWT 5
J JTable DefaultTableModel - Änderungen feststellen AWT, Swing, JavaFX & SWT 8
C Übernahme von Änderungen in einer JTable AWT, Swing, JavaFX & SWT 7
J Verzögerung bei Änderungen der Anzeige abwarten AWT, Swing, JavaFX & SWT 5
R Swing 2 jTables -2 Models - 1 Datenklasse: Änderungen AWT, Swing, JavaFX & SWT 11
M In Jlist auf Änderungen von mehreren JLabels reagieren AWT, Swing, JavaFX & SWT 3
Pithecanthropus [gelöst ]ActionListener soll nur Änderungen "bemerken" AWT, Swing, JavaFX & SWT 2
B Keine Änderungen an JLabel durch Array möglich AWT, Swing, JavaFX & SWT 12
U Beste Möglichkeit JTable-Änderungen in DB zu schreiben? AWT, Swing, JavaFX & SWT 14
S Textfeld soll auf Änderungen von nutzer und program reagiern AWT, Swing, JavaFX & SWT 3
P Änderungen in xml datei speichern AWT, Swing, JavaFX & SWT 7
A JTable Änderungen anzeigen (DefaultTableModel) AWT, Swing, JavaFX & SWT 5
T JTable Änderungen AWT, Swing, JavaFX & SWT 2
M Änderungen an JPanel nicht sichtbar AWT, Swing, JavaFX & SWT 8
S Swing: Änderungen in JLabel oder JTextField sofort anzeigen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben