2012-02-09 51 views
5

Khi sử dụng JTextFields tôi muốn đặt văn bản mặc định.Bỏ chọn lựa chọn mặc định trên JTextfield

Sau đó, tôi chạy chương trình và văn bản mặc định này sẽ tự động được chọn (ít nhất là khi bạn chỉ có một trường). Nói cách khác, nếu tôi nhập một chữ cái ngay lập tức, văn bản mặc định sẽ bị xóa và thay thế bằng văn bản mới.

Câu hỏi của tôi là cách tôi có thể thay đổi cài đặt mặc định theo cách cho phép tôi nhập một chữ mà không xóa văn bản mặc định? Tôi muốn chữ cái vừa được thêm vào cuối văn bản mặc định.

Dưới đây là mã của tôi:

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()); 
     } 
    } 
} 

}

Tôi đã thử những thứ như isFocusable(), setFocusable(), setCaterPosition() và phương pháp tương tự khác, nhưng ở đây tôi nghĩ mình cần một cách tiếp cận khác nhau .

+0

Để được trợ giúp tốt hơn sớm hơn, gửi một [SSCCE] (http://sscce.org/). –

+1

hãy tìm hiểu các quy ước đặt tên java và gắn bó với chúng – kleopatra

+1

... và _don't_ sử dụng keylisteners – kleopatra

Trả lời

3

cho @Pete và sẽ bị xóa

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

Điều này rất hay. Xin đừng xóa câu trả lời này!/Pete –

+0

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

+0

@mKorbel: Chúc mừng bạn đã đạt mốc 50K + :-) –

3

Nếu bạn di chuyển dấu mũ đến cuối thì sao?

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

vâng, tôi đã thử điều đó, nhưng không giúp đỡ. –

+2

* "Tôi đã thử rằng" * Hãy thử đăng một SSCCE cho chúng tôi thấy nỗ lực tốt nhất của bạn. Sau khi tất cả, chúng tôi không phải là độc giả tâm trí. –

+2

Sử dụng txt.getDocument(). GetLength() thay vì txt.getText(). Length(). – camickr

6

Chỉ cần thêm một FocusListener cho tập trung đạt được, mà sẽ làm cho bạn cùng với tfield2.setCaretPosition (tfield2.getDocument() getLength().); đây xem mã giúp đỡ của bạn:

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 để sử dụng 'getDocument(). GetLength()' thay vì 'getText(). Length()'. – camickr

+0

+1 để được tư vấn tốt. –

Các vấn đề liên quan