Focus auf titledborder

Eichelhäer

Bekanntes Mitglied
Hallo, weiß jemand wie man bei einem JTextfield mit ner TitledBorder bei einem Klick auf diese Border diesen Klick abfangen kann. Also was passiert wenn man auf diese Border klickt?
 

mihe7

Top Contributor
Das dürfte ein ganz normales MouseEvent auf dem Textfeld sein. Dann mit den Insets des Textfelds abgleichen.
 

Eichelhäer

Bekanntes Mitglied
Ok.

[CODE lang="java" title="Code für die Insetsprüfung"]

Insets insets = textfield.getInsets();

public void mousePressed(MouseEvent e) {
if(textfield.contains(e.getX(),e.getY())) {
//Hier prüfe ich ob die mouse innerhalb der insets ist
//da ich mich nur auf die textfeld componente beziehe brauch ich e.getScreenX() glaub ich nicht
if(e.getY() >= insets.top || e.getY() <= insets.bottom || e.getX() >= insets.left || e.getX() <= insets.right) {
textfield.setCaretPosition(textfield.getCaretPosition());
}
}

}[/CODE]

Allerdings erziele ich nicht den gewünschten Effekt. Also innerhalb des Textfeldes geht das mit der Cursor position wunderbar, aber sobald ich auf die Border komme hab wird das Caret unweigerlich auf 0 gesetzt. Wie du schon vorgeschlagen hast habe ich nur die Option über die Insets ne Border hat ja in dem Sinne keinen direkten focus.
Nen Focuslistener hab ich auch eingebaut das geht alles wunderbar. Hab auch schon versucht die Insets der Border innerhalb des Textfeldes zu prüfen, ob die Maus außerhalb dieser ist aber geht auch nicht.


Java:
//Hier setze ich die Border mit den beiden Konstanten justification und position die Methode hat aber mit dem Caret eig nichts zu tun ,oder?
title = BorderFactory.createTitledBorder(blackline,s,TitledBorder.RIGHT,TitledBorder.DEFAULT_POSITION,title_font);
 

Eichelhäer

Bekanntes Mitglied
Naja das Aussehen. Also ich hab das textfield auf nem label. Das größer ist als das textfield. Jalbel nimmt icons an ich möchte ein rundes rechteck also wie ing g.drawRoundRect als Rahmen um die ComponentenCombination zeichen. Ich hatte zunächst versucht die einzelnen Componenten die alle in einem klein JPanel liegen zu zeichnen Graphics g etc. Hatte aber die gloreiche Idee einfach selber einen runden Rechteckrahmen zu malen und den dan auf das Label mittels setIcon zu packen. Momentan ist alles recht kantig und ich habe eigentlich nur mit den Farben einen Rollover effekt bei nem Jlabel in dem ein JTextfield liegt erzielt. Aber ich denke das löst das Problem nicht wirklich ob das feld in nem jpanel oder in nem jlabel liegt, denn der titled rahmen liegt ja dennoch in der Componente und sobald ich (zumindest visuell) in das Textfeld klicke ich wieder den rahmen erwische und der cursor wieder bei 0 landet. Mal abgesehen davon wie ist das eigentlich mit den default werten? Denn wenn man einfach nur ein JTextfeld auf ein JPanel setzt ohne wirklich notwendigen schnickschnack (sorry etwas salopp) lässt sich eingegebener text in das feld durch wilder rumgeklicke markieren. Das muss ja irgendwo eingestellt worden sein. Wie bekommt man z.B. Zugriff auf diese "Natürlichen componenten werte"?
 

Eichelhäer

Bekanntes Mitglied
Hier mal der ganze Code rund ums Textfield:

Java:
public FocusListener getFocusListener(JComponent c,String s,JLabel label) {
        
        FocusListener f = new FocusListener() {

            String temp = "";
            
            @Override
            public void focusGained(FocusEvent e) {
                
                title = BorderFactory.createTitledBorder(blackline,s,TitledBorder.RIGHT,TitledBorder.ABOVE_TOP,title_font);
                
                if (c instanceof JTextField) {
                    
                    if(!((JTextField)c).getText().isBlank()) {
                        if(temp.isEmpty()) {
                            ((JTextField)c).setText("");
                        }
                        else {
                            ((JTextField)c).setText(temp);
                        }
                    }
                    
                    ((JTextField)c).setCaretPosition(((JTextField)c).getCaretPosition());
                    ((JTextField)c).setBackground(Color.WHITE);
                    ((JTextField)c).setBorder(title);
                    ((JTextField)c).setCursor(new Cursor(Cursor.TEXT_CURSOR));
                    
                    
                    label.setBackground(Color.BLACK);
                }
                
            }

            @Override
            public void focusLost(FocusEvent e) {
                
                if (c instanceof JTextField) {
                    
                    temp = ((JTextField)c).getText();
                    
                    if(((JTextField)c).getText().isBlank()) {
                        ((JTextField)c).setText(s);
                    }
                    else {
                        ((JTextField)c).setText(temp);
                    }
                    
                    ((JTextField)c).setBackground(Color.LIGHT_GRAY);
                    ((JTextField)c).setBorder(null);
                    
                    label.setBackground(Color.LIGHT_GRAY);
                }
            }
        };
        
        return f;
    }
    
    public DocumentListener getDocumentListener(JTextField textfield) {
        
        DocumentListener documentListener = new DocumentListener() {

            public void changedUpdate(DocumentEvent documentEvent) {
                caret_position = getLength(documentEvent);
                textfield.setCaretPosition(caret_position);
            }
            
            public void insertUpdate(DocumentEvent documentEvent) {
                caret_position = getLength(documentEvent);
                textfield.setCaretPosition(caret_position);
            }
              
            public void removeUpdate(DocumentEvent documentEvent) {
                caret_position = getLength(documentEvent);
                textfield.setCaretPosition(caret_position);
             }
        };
        
        return documentListener;
    }
    
    private int getLength(DocumentEvent documentEvent) {
        Document source = documentEvent.getDocument();
        int length = source.getLength();
        return length;
      }
    
    public MouseAdapter getMouseAdapter(JTextField textfield,JLabel label) {
        
        MouseAdapter m = new MouseAdapter() {
            
            Insets insets = textfield.getBorder().getBorderInsets(textfield);
            
            public void mouseEntered(MouseEvent e) {
                if(label.getBackground() == Color.LIGHT_GRAY) {
                    label.setBackground(Color.GRAY);
                    label.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                    textfield.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
                }
            }
          
            public void mouseExited(MouseEvent e) {
                if(label.getBackground() == Color.GRAY) {
                    label.setBackground(Color.LIGHT_GRAY);
                }
            }
            
            public void mouseClicked(MouseEvent e) {
                if(textfield.contains(e.getX(),e.getY())) {
                    if(e.getY() >= insets.top || e.getY() <= insets.bottom || e.getX() >= insets.left || e.getX() <= insets.right) {
                        textfield.setCaretPosition(textfield.getCaretPosition());
                    }
                }
            }
            
            public void mousePressed(MouseEvent e) {
                if(textfield.contains(e.getX(),e.getY())) {
                    if(e.getY() >= insets.top || e.getY() <= insets.bottom || e.getX() >= insets.left || e.getX() <= insets.right) {
                        textfield.setCaretPosition(textfield.getCaretPosition());
                    }
                }
                
            }
            
            public void mouseReleased(MouseEvent e) {
                if(textfield.contains(e.getX(),e.getY())) {
                    if(e.getY() >= insets.top || e.getY() <= insets.bottom || e.getX() >= insets.left || e.getX() <= insets.right) {
                        textfield.setCaretPosition(textfield.getCaretPosition());
                    }
                }
                if(textfield.getSelectionStart()>0 && textfield.getSelectionEnd() > 0) {
                    textfield.setSelectionStart(0);
                    textfield.setSelectionEnd(caret_position);
                    textfield.setSelectionColor(Color.LIGHT_GRAY);
                }
            }
        };
        
        return m;
    }
    
    public MouseMotionListener getMouseMotionListener(JTextField textfield) {
        MouseMotionListener m = new MouseMotionListener() {

            @Override
            public void mouseDragged(MouseEvent e) {
                textfield.setCaretPosition(textfield.getCaretPosition());
                textfield.setSelectionStart(0);
                textfield.setSelectionEnd(caret_position);
                textfield.setSelectionColor(Color.LIGHT_GRAY);
            }

            @Override
            public void mouseMoved(MouseEvent e) {
                
            }
            
        };
        return m;
    }
    
    public JTextField createTextField(String s) {
        
        JTextField textfield = new JTextField();
        textfield.setFont(font);
        textfield.setSelectionColor(Color.LIGHT_GRAY);
        textfield.setBackground(Color.LIGHT_GRAY);
        textfield.setText(s);
        textfield.setCaretPosition(0);
        textfield.setBorder(empty);
        textfield.setOpaque(true);
        return textfield;
    }

Die zuweisung der listener ist vorhanden und geht.
 

mihe7

Top Contributor
@Eichelhäer, ich kann Dir irgendwie nicht folgen. Was willst Du denn eigentlich erreichen? Ich dachte an so etwas:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class Test {

    public void run() {
        JPanel panel = new JPanel();
        JTextField tf = new JTextField(30);
        panel.add(tf);
        tf.setBorder(null);
        panel.setBackground(tf.getBackground());
        panel.setBorder(createBorder("Test"));
        panel.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                // Panel angeklickt...
            }
        });

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    private Border createBorder(String title) {
        TitledBorder border = new TitledBorder(title);
        return border;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 

Eichelhäer

Bekanntes Mitglied
Naja ich möchte egal wohin ich in mein JTextfield, dessen border eine titledborder ist die innerhalb meines textfeldes liegt, klicke , meine caretposition ans ende bzw an den anfang des textfeldes gesetzt wird. Je nachdem ob was drinsteht oder nicht. Ich poste mal nen screenshot...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JavaFX TextInputDialog: Focus auf Eingabefeldinhalt setzen und nach OK Inhalt leeren AWT, Swing, JavaFX & SWT 5
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
xYurisha Gui Focus von JTextField weglenken AWT, Swing, JavaFX & SWT 6
O Focus zwischen Chat und Spiel wechselns AWT, Swing, JavaFX & SWT 3
T bekomme keinen Focus auf JTextField AWT, Swing, JavaFX & SWT 3
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
K JavaFX Focus Listener für gesamte Scene AWT, Swing, JavaFX & SWT 1
C JOptionPane.showConfirmDialog() -> Focus auf NEIN -> Enter gibt YES_OPTION zurück AWT, Swing, JavaFX & SWT 6
T SWT Button soll nur sichbar sein,wenn im Textfeld der Focus ist AWT, Swing, JavaFX & SWT 4
B Swing JTextfeld bekommt nur jedes Zweite mal Focus AWT, Swing, JavaFX & SWT 11
E JTextPane Focus AWT, Swing, JavaFX & SWT 1
D ComboBoxCellEditor Refresh beim Focus AWT, Swing, JavaFX & SWT 4
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
A Focus Problem AWT, Swing, JavaFX & SWT 4
I focus an ein jdialog geben AWT, Swing, JavaFX & SWT 3
B JInternalFrame Focus setzten geht nicht AWT, Swing, JavaFX & SWT 2
A Swing Focus auf gemalte Component AWT, Swing, JavaFX & SWT 5
H Swing JTextField in JWindow, JWindow bekommt focus zurück? AWT, Swing, JavaFX & SWT 9
M Swing Focus für Buttons deaktiviert --> keine Reaktion mehr auf Tastendrücke AWT, Swing, JavaFX & SWT 5
M focus subFrame AWT, Swing, JavaFX & SWT 3
G Force Focus für JButton AWT, Swing, JavaFX & SWT 2
lumo SWT Composite Focus AWT, Swing, JavaFX & SWT 2
T disabled Checkbox soll trotzdem Focus bekommen AWT, Swing, JavaFX & SWT 9
C Swing Focus Management AWT, Swing, JavaFX & SWT 3
lumo SWT Table Selection Color +Focus Out AWT, Swing, JavaFX & SWT 14
H Swing Focus bekommen AWT, Swing, JavaFX & SWT 4
D Swing keine Tabellen Zeilen ohne Focus AWT, Swing, JavaFX & SWT 7
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
L AWT Focus auf Fenster setzen AWT, Swing, JavaFX & SWT 4
H warum kann ich das focus event nicht abfangen ? AWT, Swing, JavaFX & SWT 5
L Swing Input Focus eines JTextFields in einer JList AWT, Swing, JavaFX & SWT 2
A Focus in JTable Cell AWT, Swing, JavaFX & SWT 3
A Focus für JApplet AWT, Swing, JavaFX & SWT 7
R Focus ermitteln AWT, Swing, JavaFX & SWT 2
C JTable Focus Handling AWT, Swing, JavaFX & SWT 2
Nitram Swing Focus im JFrame AWT, Swing, JavaFX & SWT 10
I Swing Focus Listener bei PComboBox von pswing Erweiterung AWT, Swing, JavaFX & SWT 7
V Swing Problem mit Focus setzen AWT, Swing, JavaFX & SWT 7
thE_29 Swing JTabbedPane Focus von Komponenten außerhalb AWT, Swing, JavaFX & SWT 10
B JTable getselectedrow liefert -1 wenn Focus verloren AWT, Swing, JavaFX & SWT 4
S Versuch den Focus zu klauen detektieren? AWT, Swing, JavaFX & SWT 14
SebSnake JFrame "Focus" erzwingen (wie JOptionPane) AWT, Swing, JavaFX & SWT 3
V JTabbedPane - keine "Focus"-Box auf selektiertem T AWT, Swing, JavaFX & SWT 2
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
O Focus im GBL steuern. AWT, Swing, JavaFX & SWT 3
K Focus an das JPanel übergeben AWT, Swing, JavaFX & SWT 2
K Focus-Problem AWT, Swing, JavaFX & SWT 9
O TextBoxen Focus über Pfeiltasten steuern AWT, Swing, JavaFX & SWT 3
G Problene mt Focus unter Swing AWT, Swing, JavaFX & SWT 7
G JTable und Focus AWT, Swing, JavaFX & SWT 30
D Beim Starten ein JTextfield Focus geben AWT, Swing, JavaFX & SWT 7
J JTextPane bekommt keinen Focus! AWT, Swing, JavaFX & SWT 3
P TextFeld Focus entfernen AWT, Swing, JavaFX & SWT 2
F Problem mit Actions, TextComponents und Focus AWT, Swing, JavaFX & SWT 2
K Focus mit Mouseclick auf JPanel setzen AWT, Swing, JavaFX & SWT 4
D Focus auf JPanel setzen AWT, Swing, JavaFX & SWT 2
B JTable - Focus - TabTaste AWT, Swing, JavaFX & SWT 2
D Focus in bestimmter Celle in JTable AWT, Swing, JavaFX & SWT 3
B Komponente in JTable bekommt keinen Focus AWT, Swing, JavaFX & SWT 3
M Focus beim öffnen eines neuen JFrames AWT, Swing, JavaFX & SWT 6
O JTextField- Selection / Focus bei nicht editierbaren Feldern AWT, Swing, JavaFX & SWT 2
J Focus auf JFrame AWT, Swing, JavaFX & SWT 3
B Focus für Textfeld AWT, Swing, JavaFX & SWT 5
B im JTree Focus setzen und navigieren AWT, Swing, JavaFX & SWT 3
B JInternalFrame in den Vordergrund rücken + Focus AWT, Swing, JavaFX & SWT 15
D JTable: Focus auf Zelle markiert ihren Text zum editieren AWT, Swing, JavaFX & SWT 2
C Komponente mit Focus bevor JButton-Klick merken. AWT, Swing, JavaFX & SWT 6
L Focus setzen AWT, Swing, JavaFX & SWT 3
G JTabbedPane, Focus, ChangeListener AWT, Swing, JavaFX & SWT 1
B Focus in JOptionPane AWT, Swing, JavaFX & SWT 2
J Focus-Problem bei Vollbildmodus AWT, Swing, JavaFX & SWT 7
A Combobox Focus-Events, Tab in Tabelle AWT, Swing, JavaFX & SWT 7
F Fenster in den Vordergrund aber nicht im Focus AWT, Swing, JavaFX & SWT 21
O Abfrage ob eine bstimmte Komponente den Focus hat AWT, Swing, JavaFX & SWT 4
T JTable Focus auf Zelle setzen AWT, Swing, JavaFX & SWT 3
R Focus durch "tabben" von JTable Zelle auf andere K AWT, Swing, JavaFX & SWT 8
R Focus speeren AWT, Swing, JavaFX & SWT 2
K JList - merkwürdiges Verhalten bei Leertaste (unter Focus) AWT, Swing, JavaFX & SWT 7
W Components Focus mit TAB-Taste VERTIKAL bewegen AWT, Swing, JavaFX & SWT 4
V JTextField Focus Cursor setzen AWT, Swing, JavaFX & SWT 2
D jcolorchooser - lost focus AWT, Swing, JavaFX & SWT 2
R Focus auf bereits geöffnetes Fenster setzen AWT, Swing, JavaFX & SWT 9
O Welche Möglichkeit zum Focus setzen! AWT, Swing, JavaFX & SWT 2
R JMenu copy Focus-Problem AWT, Swing, JavaFX & SWT 2
M Focus einstellen AWT, Swing, JavaFX & SWT 3
G Focus so setzen, daß in einer jTextArea der Cursor blinkt AWT, Swing, JavaFX & SWT 7
G JTable: Rahmen bei Focus um Zelle AWT, Swing, JavaFX & SWT 2
thE_29 Modaler Dialog - close on not focus AWT, Swing, JavaFX & SWT 3
P Focus auf JFrame AWT, Swing, JavaFX & SWT 5
G JOptionPane verliert Focus AWT, Swing, JavaFX & SWT 3
A JTree Problem mit Focus bzw. Selection AWT, Swing, JavaFX & SWT 5
C Focus setzen AWT, Swing, JavaFX & SWT 2
G JTree Focus setzen AWT, Swing, JavaFX & SWT 2
F HILFE!!! Focus-Probleme bei unterschiedlichen Panel's AWT, Swing, JavaFX & SWT 3
H Nimbus L&F TitledBorder AWT, Swing, JavaFX & SWT 2
F Swing Mehrzeiliger TitledBorder AWT, Swing, JavaFX & SWT 3
R TitledBorder: Beschriftung am senkrechten Rand AWT, Swing, JavaFX & SWT 3
J Swing JTable, jede Zelle ein anderer Title im TitledBorder AWT, Swing, JavaFX & SWT 5
S Kombinierte TitledBorder kursiv/normal AWT, Swing, JavaFX & SWT 6
R Show/Hide eines JPanels mit TitledBorder. AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben