2009-03-05 4 views
19

런타임시 내 Swing 응용 프로그램의 로캘을 변경하고 화면의 모든 텍스트 요소를 새 로캘의 ResourceBundle에서 지역화 된 텍스트로 업데이트 할 수 있기를 바랍니다.Swing에서 런타임시 로케일 변경

지역화 된 텍스트를 렌더링하는 모든 구성 요소에 대해 스윙 구성 요소를 사용자 지정하거나 UIDelegates를 만들지 않고도이 작업을 수행 할 수 있습니까?

아니요, 그렇다면 구현을 고려해 볼 수있는 좋은 해결책은 무엇입니까?

+0

여기에 응답 : http : // stackoverflow.com/questions/14810454/swing-internationalization-how-to-update-language-at-runtime/30960413 # 30960413 – Heitor

답변

12
  1. 응용 프로그램 로캘을 변경하고 (아마도 새로운 값을 유지하는 데 사용되는) 메서드와 로컬 화 된 문자열을 가져 오는 데 사용되는 메서드가 있습니다.

  2. 는 인터페이스를 만들기 :

    interface LocaleChangeListener { 
        void onLocaleChange(); 
    } 
    

    런타임에 로케일을 변경하고 재 onLocaleChange()에 새 값을 설정 할 수 있어야 UI 구성 요소를 구현합니다.

  3. 이제 첫 번째 방법으로 로캘 변경에 대한 알림을받을 리스너 목록을 준비하십시오.

+0

우리는 이와 비슷한 것을하기로 결정했습니다. 우리는 몇 가지 시스템 속성과 리플렉션을 사용하여 이벤트가 발생할 때 화면의 모든 구성 요소를 새로 고칩니다. 최상위 레벨 Jpanel은 로컬 변경 사항을 수신 대기합니다. –

-1

내가 볼이 확실한 방법있다 : 대신 ResourceBundle에서 String을 얻기의

, 이벤트 소스 String 홀더의 어떤 종류를 얻을. Document은 매우 무거운 솔루션이지만, 변경할 수없는 값을 대체 할 수있는 것은 무엇이든 할 것입니다. 레이블에 텍스트를 설정하는 대신 청취자를 설정하는 메소드가 있어야합니다. 이것은 꽤 "무거운"해결책입니다.

또는 로캘 변경에 따라 실행되는 리스너의 중앙 리포지토리를 가지고 각각이 돌아가서 설치 코드의 관련 부분을 다시 실행합니다 (복제 안 함). 말 그대로 리소스 문자열을 사용하는 JLabel이있는 일반적인 경우에는 WeakHashMap<JLabel,String>을 사용하여이 모든 것을 하나의 수신기로 결합 할 수 있습니다. 때로는 작은 청취자를 많이 피하는 것이 좋습니다.

2

언어 기본 설정을 저장 한 다음 변경 사항을 적용하려면 앱을 다시 시작해야 할 수 있습니다.

그런 다음 GUI를 렌더링하기 전에 시작시 Locale.setDefault(Locale.<desired language>);을 사용할 수 있어야합니다. 그러면 로케일이 바뀌어야 원하는 .properties 파일이로드됩니다.

+0

이것은 타임 라인에 맞는 것을 만들 수 없다면 우리가 할 일입니다. 감사합니다 –

+0

OP는 런타임에 무언가를 원합니다. 다시 시작은 옵션이 아닙니다. – FaithReaper

16

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);을 사용하여 문자열에 액세스하십시오.

기본 로캘을 업데이트 할 때 예 : Locale.setDefault(Locale.GERMAN); 명확 ResourceBundle의 캐시를 통해 : ResourceBundle.clearCache();

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);의 다음 호출해야하는 반송 선택한 로케일의 지역화 된 문자열입니다.

+1

다른 하나는 꽤 좋지만 흥미 롭습니다. 실제로 대답을 받아 들여야합니다. – Whimusical

+0

제 경우에는 이것을 추가해야합니다. JComponent.setDefaultLocale (Locale.GERMAN); – ktulinho

+0

작동하지 않을 수 있습니다. 사실 나는 당신이 어떻게 작동하게 할 수 있는지 모른다. – FaithReaper

0

로캘을 변경하면 firePropertyChangeEvent ("locale", "...")를 수행 한 다음 label 등이 업데이트 될 때마다 propertyChangeListener()를 추가하고 등록하는 것은 어떻습니까?

관련 문제