2015-05-18 2 views
0

Я пытаюсь установить цвет фона в моей пользовательской JOptionPane, и что бы ни случилось, я не могу заставить часть сообщения изменять цвет.UIManager в Java Swing не работает последовательно?/JOptionPane Message Background

Попытка № 1 была установить фон панели и непрозрачный.

Попытка № 2 также должна была прокручивать компоненты панели и устанавливать непрозрачные и/или фоновые атрибуты, если они были JPanel или JLabel.

Это не работает для части сообщения. Из того, что я вижу, JPanel даже не существует как один из компонентов.

Попытка № 3 была использовать UIManager, однако это не работает последовательно.

Что я имею в виду, если бы вы запускали программу 5 раз, иногда цвета фона не менялись, иногда все они менялись, а иногда некоторые из них менялись.

Я бегу внутри потока invokeLater.

UIManager.put("OptionPane.background",Color.white); 
UIManager.put("JOptionPane.background",Color.white); 
UIManager.put("Panel.background",Color.white); 
UIManager.put("JPanel.background",Color.white); 

Любые идеи?

+1

Сообщение [MCVE] (http://stackoverflow.com/help/mcve) за помощью. – alex2410

+1

* «Любые идеи?» * Вместо этого используйте 'JDialog'. Серьезно, 'JOptionPane' - удобный небольшой класс утилиты, но как только он приходит к его настройке, это кошмар. –

ответ

2

Вы можете использовать следующие обходного:

JLabel messageLabel = new JLabel("Background is cyan!") { 
     /** 
     * {@inheritDoc} 
     */ 
     @Override 
     public void addNotify() { 
      super.addNotify(); 
      if (getRootPane() != null) { 
       List<Component> children = findAllChildren(getRootPane()); 
       for (Component comp : children) { 
        if (!(comp instanceof JButton)) { 
         comp.setBackground(Color.CYAN); 
        } 
       } 
      } 
     } 

     private List<Component> findAllChildren(Component aComp) { 
      List<Component> result = new ArrayList<Component>(); 
      result.add(aComp); 
      if (aComp instanceof Container) { 
       Component[] children = ((Container) aComp).getComponents(); 
       for (Component c : children) { 
        result.addAll(findAllChildren(c)); 
       } 
      } 
      return result; 
     } 
    }; 
    JOptionPane.showConfirmDialog(null, messageLabel, "Test title", JOptionPane.YES_NO_CANCEL_OPTION);