2014-04-26 2 views
3

다른 모양을 사용하려면 위젯을 사용해야하는 응용 프로그램을 작성하고 있습니다. &이 표시됩니다. 응용 프로그램의 나머지 부분은 & 느낌으로 시스템을 사용합니다.우분투에서 모양과 느낌 문제가 발생했습니다.

내 접근 방식은 원하는 응용 프로그램을 LF로 바꾸기 위해 응용 프로그램을 초기화하는 동안 구성 요소를 만든 다음 LF를 재설정하는 것이 었습니다. Windows 운영 체제에서는 정상적으로 작동하지만 Ubuntu에서 테스트하는 동안 구성 요소의 LF를 기괴한 방식으로 설정하지 못했습니다.

우분투에서 UIManager.getSystemLookAndFeelClassName()은 LF가 javax.swing.plaf.metal.MetalLookAndFeel이라고보고합니다. 이것은 첫 번째 문제입니다. com.sun.java.swing.plaf.gtk.GTKLookAndFeel을 반환 할 것으로 예상됩니다. 이상한 부분은 프로그램이 Metal LF를 사용할 때 내 접근 방식이 작동하지만 GTK LF를 사용할 때 오류가 발생하여 전체 프레임과 그 안에있는 모든 구성 요소를 GTK LF로 설정하는 것입니다. 나는이 문제의 재현성에 대해 확실하지 오전하지만,

import javax.swing.*; 
import java.awt.*; 

import static javax.swing.UIManager.*; 

public class LaFTest { 
    public static void main(String[] argv) throws ReflectiveOperationException, UnsupportedLookAndFeelException { 
     String[] keys = { 
       "java.specification.version", 
       "java.version", 
       "java.vm.version", 
       "java.specification.vendor", 
     }; 
     for (String key : keys) { 
      System.out.printf("%-40s%s\n", key, System.getProperty(key)); 
     } 

     System.out.println(UIManager.getSystemLookAndFeelClassName()); 

     // Swap for "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" 
     setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     JFrame frame = new JFrame("LaF Test"); 
     Container content = frame.getContentPane(); 
     content.setLayout(new GridLayout(2, 0)); 
     JButton button = new JButton("System"); 
     content.add(button); 

     LookAndFeel previous = getLookAndFeel(); 
     for (LookAndFeelInfo feel : getInstalledLookAndFeels()) { 
      if (feel.getName().equals("Nimbus")) { 
       setLookAndFeel(feel.getClassName()); 
      } 
     } 

     JButton second = new JButton("Nimbus"); 
     content.add(second); 

     setLookAndFeel(previous); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

참고 :

다음 SSCCE

문제를 보여줍니다. 빠른 Google은 비슷한 문제가 나타나지 않기 때문에 내 컴퓨터에만 해당 될 수 있습니다. 그럼에도 불구하고, 우분투 12에서 13, 13에서 14로 업데이트 할 때까지 계속 유지되었습니다.이 글에서 Swing과 관련된 문제는 아니라고 가정합니다.

위의 프로그램의 출력, 내 컴퓨터에

java.specification.version    1.7 
java.version       1.7.0_51 
java.vm.version       24.51-b03 
java.specification.vendor    Oracle Corporation 
javax.swing.plaf.metal.MetalLookAndFeel 

금속의 느낌을 사용하여 결과 창

with metal feel

느끼는 GTK에 대한 스와핑,

입니다

GTK feel overriding

나는 이것에 대해 잠시 동안 놀았지만 결과는 없었다. 내가 빠진 것이 있습니까? 누구든지이 코드를 재현 할 수 있습니까? 그렇다면 Java 배포판이나 코드에 버그가 있습니까? 내 목표를 달성하기위한 더 좋은 방법이 있습니까?

+0

나는 당신의 질문을 정말로 이해하지 못합니다. 하나의 패널에 2 개의 다른 모양과 느낌으로 2 개의 버튼을 표시하고 싶습니까? 나는이 접근법이 어떤 식 으로든 (심지어 작동 할 때조차도) 의도 된 것이라고 생각하지 않는다 ... – Ben

+0

긴 샷이지만 if (feel.getName(). equals ("Nimbus")) 내부의 프린트를 추가하여 후광을 확인한다. L & F는 avail post-GTK 세트입니다. – Java42

답변

0

필자는이 디버깅을 아주 좋아했지만, 마감일이 가까워짐에 따라 Oracle Java 패키지를 설치하게되었습니다. 이로 인해 문제가 해결되었습니다. 실망스러운 답변이지만 영구적으로 문제를 해결했습니다.