2012-02-09 6 views
5

JTextFields를 사용하는 경우 기본 텍스트를 설정하고 싶습니다.JTextfield에서 기본 선택을 선택 취소하십시오.

그런 다음 프로그램을 실행하면이 기본 텍스트가 자동으로 선택됩니다 (적어도 하나의 필드 만있는 경우). 즉, 문자를 바로 입력하면 기본 텍스트가 삭제되고 새 문자로 바뀝니다.

제 질문은 기본 텍스트를 삭제하지 않고 문자를 입력 할 수 있도록 기본 설정을 어떻게 변경할 수 있습니까? 편지가 기본 텍스트의 끝에 추가되기를 바랍니다. 여기

내 코드입니다 :

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

} 내가 isFocusable(), 위해서 setFocusable(), setCaterPosition() 및 기타 유사한 방법 같은 것들을 시도

, 그러나 여기에서 나는 다른 접근 방식을 필요가 있다고 생각 .

+0

삭제됩니다 다음은 당신의 도움에 대한 코드를 참조하십시오. –

+1

Java 명명 규칙을 배우고 그들에게 붙이십시오 – kleopatra

+1

... 그리고 keylisteners를 사용하지 마십시오 – kleopatra

답변

3

더 나은 도움이 필요한

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

이것은 매우 훌륭합니다. 이 답변을 삭제하지 마십시오!/Pete –

+0

@ Hovercraft 뱀장어로 가득 차 있음 pip pip _ _ _ _ ... – mKorbel

+0

@mKorbel : 50K + :-)의 목표에 도달 한 것에 대한 축하 –

3

캐럿을 끝까지 이동하면 어떻습니까?

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

예, 나는 그것을 시도했지만 도움이되지 않았습니다. –

+2

* "나는 그것을 시도했다"* 최선의 시도를 보여주는 SSCCE를 게시 해보십시오. 결국, 우리는 독자들을 꺼리지 않습니다. –

+2

txt.getText(). length() 대신 txt.getDocument(). getLength()를 사용하십시오. – camickr

6

그냥 tfield2.setCaretPosition와 함께 당신을 위해 할 것입니다 습득 한 초점에 대해 하나 개의 FocusListener 추가 (tfield2.getDocument을() getLength().); 빨리,이 [SSCCE] (http://sscce.org/)를 게시 @Pete에 대한

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 getText(). length() 대신'getDocument(). getLength()'를 사용하십시오. – camickr

+0

+1 좋은 충고. –