2012-02-09 11 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

बेहतर मदद के लिए जल्दी ही, एक [SSCCE] (http://sscce.org/) पोस्ट करते हैं। –

+1

कृपया जावा नामकरण सम्मेलनों को सीखें और उन्हें – kleopatra

+1

पर चिपकाएं ... और _don't_ keylisteners का उपयोग करें – kleopatra

उत्तर

3

@Pete के लिए और हटा दिया जाएगा

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

यह बहुत अच्छा है। कृपया इस उत्तर को मत हटाएं!/पीट –

+0

@ होवरक्राफ्ट पूर्ण ईल्स पाइप पाइप पाइप _ _ _ _ ... – mKorbel

+0

@mKorbel: 50K + के मील का पत्थर तक पहुंचने के लिए बधाई :-) –

3

अगर आप अंत तक देखभाल को स्थानांतरित करते हैं तो कैसे?

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

हाँ, मैंने कोशिश की है, लेकिन मदद नहीं की। –

+2

* "मैंने कोशिश की है" * एक एसएससीसीई पोस्ट करने का प्रयास करें जो हमें अपना सर्वश्रेष्ठ प्रयास दिखाता है। आखिरकार, हम दिमागी पाठक नहीं हैं। –

+2

txt.getDocument()। Txt.getText() लंबाई() के बजाय getLength() का उपयोग करें। 'GetText()। GetText() लंबाई()' के बजाय get getocument()। GetLength() 'का उपयोग करने के लिए – camickr

6

बस प्राप्त ध्यान देने के लिए एक FocusListener, कि tfield2.setCaretPosition के साथ आप के लिए क्या करेंगे जोड़ने (tfield2.getDocument() getLength()।); यहाँ आपकी मदद के लिए कोड देखें:

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। आपकी अच्छी सलाह के लिए – camickr

+0

+1। –

संबंधित मुद्दे