2014-01-07 4 views
0

У меня есть следующий класс в моем проекте JavaИзменить вид JComboBox

public class ComboBox extends JComboBox { 
    private static final long serialVersionUID = 1L; 

    ComboBox(){ 
     for(Component comp : this.getComponents()){ 
      if(comp instanceof AbstractButton){ 
       comp.setVisible(false); 
      } 
     } 
    } 

    } 

Этот код изменить внешний вид JComboBox, но после того, как второй, старый JComboBox появляются. Мой вопрос заключается в том, как постоянно обновлять JComboBox.

+2

Этот код меняет вид JComboBox, но после второго появляется старый JComboBox. -> выглядит как ошибка в вашем коде – mKorbel

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

0

Похоже, вы хотите скрыть кнопку со стрелкой JComboBox. В архитектуре Swing эта работа делегируется классу UI (делегат UI), который создается на Component ctor, вызывая метод updateUI().

Как вы стреляете по кнопке со стрелкой в ​​ctor, может быть вызван метод updateUI().

Я думаю, что вы могли бы исправить свой код, удалив звонки на updateUI() или сокрыв кнопку со стрелкой в ​​этой точке.

, например:

class ComboBox<T> extends JComboBox<T> { 
     private static final long serialVersionUID = 1L; 

     public ComboBox(){ 
     } 

     @Override 
     public void updateUI() { 
      super.updateUI(); 
      hideArrowButton(); 
     } 

     private void hideArrowButton() { 
      for(Component comp : this.getComponents()){ 
       if(comp instanceof AbstractButton){ 
        comp.setVisible(false); 
       } 
      } 
     } 
    } 

Также вы могли бы написать делегата UI, который скрывает кнопку со стрелкой:

class ComboUI extends MetalComboBoxUI { 

    @Override 
    protected JButton createArrowButton() { 
     JButton arrowButton = super.createArrowButton(); 
     arrowButton.setVisible(false); 

     return arrowButton; 
    } 

    public static ComponentUI createUI(JComponent c) { 
     return new ComboUI(); 
    } 
} 

и установить его на вашем JComboBox путем вызова метода setUI() или установить его по умолчанию для всех JComboBox путем обновления UIManager

UIManager.put("ComboBoxUI", ComboUI.class.getName()); 

См. http://www.oracle.com/technetwork/java/architecture-142923.html#modified_mvc для получения дополнительной информации о делегатах Swing MVC и UI.

+0

Спасибо. У меня есть еще один вопрос. Есть ли способ удалить границу всех компонентов JComboBox. Например, что-то вроде этого comp.setBorder (null); – user3137989

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