2016-06-08 47 views
3

我無法獲得標準BorderFactory.createEmptyBorder在Java Swing中正常工作。Java Swing右邊框無法在Microsoft Windows上工作

我試着用一個簡單的Java應用程序創建一個微調視圖並在其周圍聲明一個空的邊框。邊框顯示在除微調視圖右側以外的任何地方。但這隻發生在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)。原因是這只是一個小問題,我陷入了這個錯誤。在小型項目中,我主要需要一個乾淨而好看的代碼,這意味着通過嘗試修復破損的代碼而不是通過執行解決方法來解決此類錯誤。

在此先感謝

+0

Windows的哪個版本? –

+0

此代碼從不聲明名爲「fenster」的變量(推測是JFrame?) – FredK

+0

抱歉。意外刪除它,同時刪除一些未使用的評論。 –

回答

2

它看起來像一個JSpinner的使用自定義佈局管理器,而不是正確地處理邊界。

我修改了代碼,讓按鈕的邊界右邊的寬度減1。我猜佈局管理器在文本字段邊緣和按鈕之間留下1像素的間隙。

似乎在Windows上工作,但它可能會混淆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併爲Up/Down箭頭編寫自定義Action。多一點工作,但它將適用於所有平臺。

此外,由於您似乎很擔心創建額外的組件,這將在這方面效率更高。 JSpinner本身就是一個複雜的組件,JFormattedTextField比簡單的JTextField複雜得多。

+0

謝謝。完美的作品 –