2016-06-08 5 views
3

에서 작동하지 않는 스윙. 자바 내가 자바 스윙에서 제대로 작동 표준 <code>BorderFactory.createEmptyBorder</code>을 얻을 수 오른쪽 테두리는 마이크로 소프트 윈도우

나는 스피너보기를 만들고 주위에 빈 상태 (empty)의 경계를 선언하는 간단한 자바 응용 프로그램과 함께 그것을 시도. 경계는 스피너보기의 오른쪽을 제외하고는 어디에서나 표시됩니다. 하지만 그것은 Windows에서만 발생했습니다. OSX에서는 의도 한대로 작동합니다.

테두리의 사용을 명확히하기 위해 내 실제 응용 프로그램에서 나는 스피너의 외부에 테두리가 다음 나는 내부의 텍스트를 중심 싶다. 나는 createCompoundBorder 속성이 매우 유용하다는 것을 알았습니다.

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

class HelloWorldSwing { 
    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(
       UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) {} 

     Runnable guiCreator = new Runnable() { 
      public void run() { 
       JFrame fenster = new JFrame("Hallo Welt mit Swing"); 
       fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       SpinnerNumberModel model = new SpinnerNumberModel(1,1,9,1); 
       JSpinner spinner = new JSpinner(model); 

       JFormattedTextField textField = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField(); 
       textField.setOpaque(true); 
       // textField.setBackground(Color.); 

       spinner.setBorder(BorderFactory.createEmptyBorder(50, 100, 50, 100)); 

       spinner.setUI(new javax.swing.plaf.basic.BasicSpinnerUI() { 
        protected Component createNextButton() { 
         Component c = new JButton(); 
         c.setPreferredSize(new Dimension(0, 0)); 
         c.setFocusable(false); 
         return c; 
        } 

        protected Component createPreviousButton() { 
         Component c = new JButton(); 
         c.setPreferredSize(new Dimension(0, 0)); 
         c.setFocusable(false); 
         return c; 
        } 
       }); 
       spinner.setBackground(Color.LIGHT_GRAY); 
       fenster.add(spinner); 

       fenster.setSize(300, 200); 
       fenster.setVisible(true); 
      } 
     }; 

     SwingUtilities.invokeLater(guiCreator); 
    } 
} 

편집 : 나는 또 하나 개의 UI 요소를 구현하는 해결책을 찾기 위해 싶지 않아요. 이것은 쉽고 간단한 솔루션이 될 것입니다 (Andrew Thompson에게 감사드립니다). 그 이유는 그것이 내가이 오류에 빠진 작은 프로젝트 일 뿐이 기 때문입니다. 소규모 프로젝트에서 나는 대체로 깔끔하고 훌륭한 코드를 원합니다. 즉, 버그는 해결 된 코드가 아닌 해결 방법으로 해결됩니다. JSpinner가 사용자 정의 레이아웃 매니저를 사용하고 올바르게 국경을 처리하지 않는 것 같습니다 사전

+0

Windows 버전은 무엇입니까? –

+0

이 코드는 "fenster"라는 변수를 선언하지 않습니다 (아마도 JFrame?) – FredK

+0

죄송합니다. 사용되지 않은 댓글을 삭제하는 동안 실수로 삭제했습니다. –

답변

2

감사합니다.

은 내가 레이아웃 매니저가 텍스트 필드의 가장자리와 버튼 사이에 1 개 픽셀 간격 잎 추측 버튼을 국경에서 1을 뺀의 오른쪽 가장자리의 폭을 제공하기 위해 코드를 수정했습니다.

윈도우에서 작동하는 것 같다,하지만 OSX 혼란을 수도?

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

class HelloWorldSwing { 
    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(
       UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception e) {} 

     Runnable guiCreator = new Runnable() { 
      public void run() { 
       JFrame fenster = new JFrame("Hallo Welt mit Swing"); 
       fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       SpinnerNumberModel model = new SpinnerNumberModel(1,1,9,1); 
       JSpinner spinner = new JSpinner(model); 

       JFormattedTextField textField = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField(); 
       textField.setOpaque(true); 
       // textField.setBackground(Color.); 

       spinner.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 0)); 

       spinner.setUI(new javax.swing.plaf.basic.BasicSpinnerUI() { 
        protected Component createNextButton() { 
         Component c = new JButton(); 
         c.setPreferredSize(new Dimension(9, 0)); 
         c.setVisible(false); 
         return c; 
        } 

        protected Component createPreviousButton() { 
         Component c = new JButton(); 
         c.setPreferredSize(new Dimension(9, 0)); 
         c.setVisible(false); 
         return c; 
        } 
       }); 
       spinner.setBackground(Color.LIGHT_GRAY); 
       fenster.setLayout(new FlowLayout()); 
       fenster.add(spinner); 

       fenster.setSize(300, 200); 
       fenster.setVisible(true); 
      } 
     }; 

     SwingUtilities.invokeLater(guiCreator); 
    } 
} 

다른 해결책은 JSpinner를 사용하지 않는 것입니다. JTextField를 사용하고 위/아래 화살표에 대한 사용자 정의 액션을 쉽게 작성할 수 있습니다. 조금 더 작업하지만 모든 플랫폼에서 작동합니다.

은 또한 당신이 그런 측면에서 훨씬 더 효율적입니다 추가 구성 요소를 만드는 방법에 대한 걱정 것으로 보인다 때문이다. JSpinner는 복잡한 컴포넌트 자체이며 JFormattedTextField는 단순한 JTextField보다 훨씬 복잡합니다.

+0

감사합니다. 완벽하게 작동합니다. –