2012-09-17 4 views
4

JFormattedTextField에 문제가 있습니다. 즉 덮어 쓰기가 아닌 모드로 유지됩니다. 비 덮어 쓰기로 설정하는 방법, 즉 setOverwriteMode (false)를 사용하여 설정하는 방법을 알았습니다.JFormattedTextField를 덮어 쓰기 모드로 유지하는 방법은 무엇입니까?

그러나이 기능을 사용하면 덮어 쓰지 않고 필드에 입력 할 수 있지만 포커스를 잃어서 필드를 다시 입력하면 overWriteMode가 다시 켜집니다!

overWriteMode를 false로 유지할 수있는 방법이 있습니까? 포커스를 잃을 때마다 false로 설정하지 않는 솔루션이 더 좋을 것입니다. 그러나 이것이 유일한 해결책 일 경우 그렇게하십시오.

이것은 내가 지금 뭘 찾았는지 있습니다 :

DefaultFormatter format = new DefaultFormatter(); 
    format.setOverwriteMode(false); 

    inputField = new JFormattedTextField(); 
    inputField.setValue("don't overwrite this!"); 
    inputField.setColumns(20); 
    format.install(inputField);// This does the trick only the first time I enter the field! 

나는 누군가가 나를 도울 수 있기를 바랍니다!

솔루션, 로빈 제안한 : 도움을

DefaultFormatter format = new DefaultFormatter(); 
    format.setOverwriteMode(false); 

    inputField = new JFormattedTextField(format); // put the formatter in the constructor 
    inputField.setValue("don't overtype this!"); 
    inputField.setColumns(20); 

감사합니다! 감사 어둠에

+0

을 놓친 무언가가있다;', 당신은 정말 – mKorbel

+0

(!) 참고를 어떻게해야합니까 : 통상, 수동으로 인스톨하는 대신에, JFormattedTextField의 생성자으로 포매터를 건네줍니다. 이것은 또한'install' 메쏘드의 javadoc에 문서화되어 있습니다 – Robin

+0

@mKorbel : 그 함수를 사용하는 것이 올바른 방향 인 것처럼 보이지만 한번만 작동하기 때문에 거기에 도착하지 않습니다. 내가 필요한 것은 필드가 비 덮어 쓰기 모드를 유지하는 것입니다. 아마'setOverWriteMode (..)'는 충분하지 못하지만 아직 모르겠습니다. –

답변

2

샷, I (false)를 DefaultFormatter를 번호에 setOverwriteMode`에 /있는 reall 이유 (들)이 무엇인지

import java.awt.GridLayout; 
import java.math.RoundingMode; 
import java.text.NumberFormat; 
import javax.swing.JFormattedTextField; 
import javax.swing.JFrame; 
import javax.swing.text.NumberFormatter; 

public class MaskFormatterTest { 

    public static void main(String[] args) throws Exception { 
     NumberFormat format = NumberFormat.getNumberInstance(); 
     format.setMaximumFractionDigits(2); 
     format.setMinimumFractionDigits(2); 
     format.setParseIntegerOnly(true); 
     format.setRoundingMode(RoundingMode.HALF_UP); 

     NumberFormatter formatter = new NumberFormatter(format); 
     formatter.setMaximum(1000); 
     formatter.setMinimum(0.0); 
     formatter.setAllowsInvalid(false); 
     //formatter.setOverwriteMode(false); 

     JFormattedTextField tf = new JFormattedTextField(formatter); 
     tf.setColumns(10); 
     tf.setValue(123456789.99); 
     JFormattedTextField tf1 = new JFormattedTextField(formatter); 
     tf1.setValue(1234567890.99); 
     JFormattedTextField tf2 = new JFormattedTextField(formatter); 
     tf2.setValue(1111.1111); 
     JFormattedTextField tf3 = new JFormattedTextField(formatter); 
     tf3.setValue(-1111.1111); 
     JFormattedTextField tf4 = new JFormattedTextField(formatter); 
     tf4.setValue(-56); 

     JFrame frame = new JFrame("Test"); 
     frame.setLayout(new GridLayout(5, 0)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(tf); 
     frame.add(tf1); 
     frame.add(tf2); 
     frame.add(tf3); 
     frame.add(tf4); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

이 '답변'으로 무슨 뜻인지 모르겠지만 코드를 컴파일 할 때 텍스트를 전혀 입력 할 수 없습니다. 이것은 도움이되지 못했습니다. –

+0

이 작동하지 않을 수도 있고, 작동하지 않을 수도 있고,'JFormattedTextField'에 사용 된'Formatter '에 따라 달라질 수 있습니다.'Funny Bugs'중 하나입니다. 다른 3-4 가지를 원하십니까? 대부분의 시간에'invokeLater), 왜냐하면 더 나은 도움을 위해 [SSCCE] (http://sscce.org/) – mKorbel

+0

@Tim Kuipers가 있어야하기 때문에 모델을보기 위해 '이상한 교통'(아마도 일부는 아닙니다)이있을 것입니다. 잠깐, 어쩌면'더러운'해킹이 있는데, 아마도 – mKorbel