2016-06-08 3 views
3

Я не могу получить стандарт BorderFactory.createEmptyBorder, работающий правильно в Java Swing.Прямая граница Java Swing не работает в Microsoft Windows

Я попробовал это с помощью простого Java-приложения, которое создает Spinner View и объявляет пустую рамку вокруг него. Граница отображается везде, за исключением правой стороны витрины. но это произошло только в 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); 
    } 
} 

EDIT: Я не хочу, чтобы найти решение, которое реализует еще один элемент пользовательского интерфейса. Это было бы простым и простым решением (спасибо Эндрю Томпсону). Причина в том, что это всего лишь небольшой проект, где я попал в эту ошибку. В небольших проектах мне в основном нужен чистый и красивый код, а это значит, что такие ошибки исправлены, пытаясь исправить сломанный код, а не путем обхода.

Заранее спасибо

+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 и написать собственное действие для стрелок вверх/вниз. Немного больше работы, но она будет работать на всех платформах.

Также, поскольку вы, кажется, беспокоитесь о создании дополнительных компонентов, это будет гораздо более эффективным в этом отношении. JSpinner - это сложный компонент, а JFormattedTextField намного сложнее, чем простой JTextField.

+0

спасибо. Прекрасно работает –

 Смежные вопросы

  • Нет связанных вопросов^_^