Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > JCOmponent rendering problem


Автор: PashaOvechkin 27.5.2008, 11:21
Привет! Занимаюсь перерисовкой многих свинг компонентов.
Столкнулся с проблемой.

Непример есть JButton, внешность которого которого мануально переопределена.

Вывожу его всевозможные размеры, получаю : 

Код


myButton.getText() = = =  0  myButton.getSize() = = = java.awt.Dimension[width=42,height=14] myButton.getMinimumSize() = = = java.awt.Dimension[width=40,height=22] myButton.getPreferredSize()  = = = java.awt.Dimension[width=44,height=22]



А реально етот компонент рисуется маленйкий - его высота 14 пихелей всего.
При чём практически всегда всё перерисовывается хорошо, но в нескольких местах имеет место такая вот проблема...

Вопрос : почему LayOut выделяет на компонент менйше места чем указанный minimumSize ?!
LayOut простенький...

Автор: w1nd 28.5.2008, 00:25
Цитата(PashaOvechkin @  27.5.2008,  11:21 Найти цитируемый пост)
Вопрос : почему LayOut выделяет на компонент менйше места чем указанный minimumSize ?!

LayoutManager не обязан учитывать предустановленные размеры компонента. Вы какой используете?

Автор: PashaOvechkin 28.5.2008, 10:18
Ситуация совсем запуталась...


Я перерисовываю компоненты так -> 
Код



 public class JRoundedButtonUI extends BasicButtonUI implements MouseListener, KeyListener, FocusListener  {
    protected static JRoundedButtonUI   buttonUI;
    protected JButton               myButton;
    
    private Shape shape         = null;
    private boolean pressed     = false;
    private boolean mouseOver   = false;
    private String text;
    
    private int startX      = 1;
    private int startY      = 1;
    private int myWidht     = 0;
    private int myHeight    = 0;
    
    
    
    private static GradientPaint pressedGradient;
    private static GradientPaint unPressedGradient;
        
    int i = 0;
    
    
    @Override
    public void installUI(JComponent c) {
        
        myButton = (JButton) c;
        buttonUI = new JRoundedButtonUI();
        
        myButton.addMouseListener(this);
        myButton.addFocusListener(this);
        myButton.addKeyListener(this);
        myButton.setFocusable(true);
        
  
       super.installUI(myButton); // если вызываю супер метода, то с  размерами всё супер, но под моей кнопкой рисуется дефолтный бордер....
// если супер не вызывать, нельзя установить размеры кнопки :( 
// как я пытаюсь обойти проблему? 

        
        Dimension size = myButton.getSize();
        Dimension prefSize = myButton.getPreferredSize(); // получаю ВСЕ необходимые размеры кнопки
        
        myButton.setBorder( BorderFactory.createEmptyBorder() );  // убираю бордер
//myButton.setBorder( null ); // или так убираю
        
        myButton.setSize( size );
        myButton.setPreferredSize( prefSize );
        myButton.setMinimumSize( prefSize ); // возвращаю на место параметры... Однако на некоторых лоок ен филах ето глючит, и компонент отрисовывается меньше(!!!!!) чем
//установленный MinimumSize (!!!)
                

    }
    
    @Override
    public void uninstallUI(JComponent c) {
        super.uninstallUI(c);
    }
    
    public static ComponentUI createUI(JComponent c) {
            return new JRoundedButtonUI();
    }
    
    @Override
    public void paint(Graphics g, JComponent c) {

// ла ла ла
    }
        


потом после становки LookAndFeel -> 
Код


        Object[] defaults = { "ButtonUI", "myPackage.JRoundedButtonUI" };       

        UIManager.getDefaults().putDefaults(defaults);


В такой ета перерисовка работает на ура со всеми леиаут менеджерами кроме Бокса... :( 

Проблема известно где... Она описана в комантариях класса отрисовки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)