2012-02-09 31 views
5

Cuando uso JTextFields me gusta establecer un texto predeterminado.Deseleccionar selección predeterminada en JTextfield

Luego ejecuto el programa y este texto predeterminado se seleccionará automáticamente (al menos cuando solo tiene un campo). En otras palabras, si escribo una letra de inmediato, el texto predeterminado será eliminado y reemplazado por el nuevo.

Mi pregunta es cómo puedo cambiar la configuración predeterminada de una manera que me permite escribir una letra sin eliminar el texto predeterminado? Me gustaría que la carta simplemente se agregue al final del texto predeterminado.

Aquí está mi código:

public class ButtonsNText extends JPanel implements ActionListener, KeyListener { 

private JTextField TextLine; 
private JToggleButton UpperCaseButton; 
private JToggleButton LowerCaseButton; 
private JCheckBox ContinuousButton; 
private ButtonGroup myButtonGroup; 

public ButtonsNText(){ 
    TextLine = new JTextField(10); 
    add(TextLine); TextLine.setName("TextLine"); 
    TextLine.setText("default text"); 
    TextLine.setCaretPosition(TextLine.getText().length()); 
    TextLine.addKeyListener(this); 
    myButtonGroup = new ButtonGroup(); 
    UpperCaseButton = new JToggleButton("Upper case"); 
    add(UpperCaseButton);UpperCaseButton.setName("UpperCaseButton"); 
    LowerCaseButton = new JToggleButton("Lower case"); 
    add(LowerCaseButton); LowerCaseButton.setName("LowerCaseButton"); 
    ContinuousButton = new JCheckBox("Continuous?"); 
    add(ContinuousButton); ContinuousButton.setName("ContinuousButton"); 
    myButtonGroup.add(UpperCaseButton); myButtonGroup.add(LowerCaseButton); 
    UpperCaseButton.addActionListener(this); 
    LowerCaseButton.addActionListener(this); 
    ContinuousButton.addActionListener(this); 

} 
public static void main(String[] args) { 
    JFrame frame = new JFrame("Hello world example"); 
    frame.add(new ButtonsNText()); 
    frame.pack(); 
    frame.setVisible(true); 
} 
@Override 
public void actionPerformed(ActionEvent e) { 
    if(e.getSource() == UpperCaseButton){ 
     TextLine.setText(TextLine.getText().toUpperCase()); 
    } 
    else if(e.getSource() == LowerCaseButton){ 
     TextLine.setText(TextLine.getText().toLowerCase()); 
    } 
} 
@Override 
public void keyReleased(KeyEvent k) { 
    if(ContinuousButton.isSelected()){ 
     if(UpperCaseButton.isSelected()){ 
      int pos = TextLine.getCaretPosition(); 
      TextLine.setText(TextLine.getText().toUpperCase()); 
      TextLine.setCaretPosition(pos); 
     } 
     else if(LowerCaseButton.isSelected()){ 
      int pos = TextLine.getCaretPosition(); 
      TextLine.setText(TextLine.getText().toLowerCase()); 
      TextLine.setCaretPosition(pos); 

     } 
    } 
    int key = k.getKeyCode(); 
    if(key == KeyEvent.VK_ENTER){ 
     if(UpperCaseButton.isSelected()){ 
      TextLine.setText(TextLine.getText().toUpperCase()); 
     } 
     else if(LowerCaseButton.isSelected()){ 
      TextLine.setText(TextLine.getText().toLowerCase()); 
     } 
    } 
} 

}

He tratado de cosas como isFocusable(), setFocusable(), setCaterPosition() y otros métodos similares, pero en este caso creo que es necesario un enfoque diferente .

+0

Para una mejor ayuda antes, post an [SSCCE] (http://sscce.org/). –

+1

por favor aprenda las convenciones de nomenclatura de java y cúmplalas – kleopatra

+1

... y _no_utilice keylisteners – kleopatra

Respuesta

3

para @Pete y se eliminarán

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.DefaultCaret; 
import javax.swing.text.DefaultHighlighter; 
import javax.swing.text.Highlighter; 

public class TestTextComponents extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JTextField jTextField1; 
    private JTextField jTextField2; 

    public TestTextComponents() { 
     initComponents(); 
    } 

    private void initComponents() { 
     jTextField1 = new JTextField(); 
     jTextField2 = new JTextField(); 
     getContentPane().setLayout(new FlowLayout()); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setTitle("Text component persistent selection"); 
     setResizable(false); 
     getContentPane().add(new JLabel(
       "Please skip between text fields and watch persistent selection: ")); 
     jTextField1.setText("jTextField1"); 
     getContentPane().add(jTextField1); 
     jTextField2.setText("jTextField2"); 
     getContentPane().add(jTextField2); 
     jTextField1.setCaret(new HighlightCaret()); 
     jTextField2.setCaret(new HighlightCaret()); 
     //Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     // setBounds((screenSize.width - 600)/2, (screenSize.height - 70)/2, 600, 70); 
    } 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTextComponents().setVisible(true); 
      } 
     }); 
    } 
} 

class HighlightCaret extends DefaultCaret { 

    private static final Highlighter.HighlightPainter unfocusedPainter = 
      new DefaultHighlighter.DefaultHighlightPainter(new Color(230, 230, 210)); 
    private static final long serialVersionUID = 1L; 
    private boolean isFocused; 

    @Override 
    protected Highlighter.HighlightPainter getSelectionPainter() { 
     return isFocused ? super.getSelectionPainter() : unfocusedPainter; 
    } 

    @Override 
    public void setSelectionVisible(boolean hasFocus) { 
     if (hasFocus != isFocused) { 
      isFocused = hasFocus; 
      super.setSelectionVisible(false); 
      super.setSelectionVisible(true); 
     } 
    } 
} 
+0

Esto es muy, muy bueno. Por favor, no elimine esta respuesta!/Pete –

+0

@Hovercraft Full Of Eels pip pip pip _ _ _ _ ... – mKorbel

+0

@mKorbel: Felicitaciones por alcanzar un hito de 50K + :-) –

3

¿Qué tal si movió el cursor hasta el final?

txt.setCaretPosition(txt.getText().length()); 
+0

Sí, lo he intentado, pero no ayudó. –

+2

* "Lo he intentado" * Intente publicar un SSCCE que nos muestre su mejor intento. Después de todo, no somos lectores de la mente. –

+2

Utilice txt.getDocument(). GetLength() en lugar de txt.getText(). Length(). – camickr

6

Sólo tiene que añadir una FocusListener para el enfoque adquirida, que va a hacer por usted junto con tfield2.setCaretPosition (tfield2.getDocument() getLength().); Aquí ver el código por su ayuda:

import java.awt.event.*; 

import javax.swing.*; 

public class TextFieldExample extends JFrame 
{ 
    public TextFieldExample() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     JPanel contentPane = new JPanel(); 
     JTextField tfield = new JTextField(10); 
     final JTextField tfield2 = new JTextField(10); 
     tfield2.setText("default text"); 
     tfield2.addFocusListener(new FocusListener() 
     { 
      public void focusGained(FocusEvent fe) 
      { 
       tfield2.setCaretPosition(tfield2.getDocument().getLength()); 
      } 

      public void focusLost(FocusEvent fe) 
      { 
      } 
     }); 

     contentPane.add(tfield); 
     contentPane.add(tfield2); 

     setContentPane(contentPane); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new TextFieldExample(); 
      } 
     }); 
    } 
} 
+0

+1 para usar 'getDocument(). GetLength()' en lugar de 'getText(). Length()'. – camickr

+0

+1 por su buen consejo. –

Cuestiones relacionadas