Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Событие перемещения разделителя в JSplitPane, Изменение размеров родителя 
:(
    Опции темы
access
Дата 19.2.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Уважаемые, есть такая проблемка. Имеется панель this, на которой лежит (CENTER) JSplitPane с вертикальным разделителем. В JSplitPane слева есть панель с размером 12 по ширине, сам разделитель имеет толщину 3, и справа панель шириной 1 (итого на всё про всё - 16). Правая панель всегда (в состоянии покоя) имеет ширину 1. Мне нужно следующее: при движении разделителя вправо ширина родителя увеличивается на единицу, при движении влево - уменьшается на 1. По этой причине и оставил правую панель шириной в единицу, ибо движения вправо иначе нету, но, как оказалось, мыслил не в ту сторону (по идее, мне вообще не нужно этой правой панели) . Код ниже:
Код

import javax.swing.*;
import java.awt.*;
public class start {
    public static void main(String[]args)
    {
        JFrame f = new JFrame();
        f.setLayout(new BorderLayout());
        f.setBounds(300, 200, 350, 250);
        f.getContentPane().setBackground(Color.gray);
        JPanel sb = new JPanel();
        sb.setPreferredSize(new Dimension(0, 20));
        sb.setBackground(Color.lightGray);
        sb.setLayout(new BorderLayout());
        LimiterToolBar ltb = new LimiterToolBar("LR", null);
        sb.add(ltb, BorderLayout.WEST);
        f.add(sb, BorderLayout.SOUTH);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}




Код

import java.awt.*;
import java.awt.event.ComponentListener;
import java.awt.event.ComponentEvent;
import java.util.HashMap;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.*;
import javax.swing.event.AncestorListener;
import javax.swing.event.AncestorEvent;

public class LimiterToolBar extends JPanel implements PropertyChangeListener, AncestorListener, ComponentListener {
    private String arrowOrient = "LR";  // left to right
    private Dimension prefSize;
    private JSplitPane split;
    private JPanel pButtons;
    private JPanel pEmpty;

    public LimiterToolBar(String aO, Dimension prefS) {
        if (aO.equalsIgnoreCase("RL"))
            arrowOrient = aO;
        else if (aO.equalsIgnoreCase("LR"))
            arrowOrient = aO;
        else    //  "LR" - default
            arrowOrient = "LR";

        setLayout(new BorderLayout());
        if (prefS!=null)
            prefSize = prefS;
        else
            prefSize = new Dimension(12 + 3 + 1, 20);
        setPreferredSize(prefSize);

        pButtons = new JPanel();
        pEmpty = new JPanel();
        split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        pEmpty.setMinimumSize(new Dimension(0, 0));
        pButtons.setMinimumSize(new Dimension(12, 0));
        pButtons.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));

        split.setDividerSize(3);
        add(split, BorderLayout.CENTER);
        split.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
        split.addPropertyChangeListener("dividerLocation" ,this);

        if (arrowOrient.equals("LR"))
        {
            split.setLeftComponent(pButtons);
            split.setRightComponent(pEmpty);
            split.setDividerLocation( (int)(prefSize.getWidth() - 1 - split.getDividerSize()) );
        }
        else if (arrowOrient.equals("RL"))
        {
            split.setRightComponent(pButtons);
            split.setLeftComponent(pEmpty);
            split.setDividerLocation((int)1);
        }

        pEmpty.addComponentListener(this);
    }

    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getSource()==split)
        {
            if (evt.getPropertyName().equalsIgnoreCase("dividerLocation"))
            {
                if ( ((Integer)evt.getNewValue()).intValue()==prefSize.getWidth() - split.getDividerSize())
                {
                    /*System.out.println("button increase Divider Location is: "+evt.getNewValue().toString());
                    prefSize = new Dimension((int)(prefSize.getWidth() + 1), (int)prefSize.getHeight());
                    this.setPreferredSize(prefSize);
                    this.updateUI();
                    split.setDividerLocation( (int)(prefSize.getWidth() - 1 - split.getDividerSize()) );*/
                }
            }
        }
    }

    public void ancestorAdded(AncestorEvent event) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void ancestorRemoved(AncestorEvent event) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void ancestorMoved(AncestorEvent event) {
    }

    public void componentResized(ComponentEvent e) {
        if (e.getSource()==pEmpty)
        {
            if (pEmpty.getWidth()==0)
            {
                prefSize = new Dimension((int)(prefSize.getWidth() + 1), (int)prefSize.getHeight());
                this.setPreferredSize(prefSize);
                this.updateUI();
                split.setDividerLocation( (int)(prefSize.getWidth() - 1 - split.getDividerSize()) );
            }
        }
    }

    public void componentMoved(ComponentEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void componentShown(ComponentEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void componentHidden(ComponentEvent e) {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}

Немного подправил код (от лишнего), может чего-то и повылазит, спрашивайте.
В общем, оно, конечно, работает. Но (пробовал через PropertyChangeListener, ComponentListener) работает криво, то есть за одно движение разделителя вправо (влево не тестировал) панель увеличивается ровно на одну единицу (ну, как и заказывал, собственно), нет "плавности" хода. Я, наверное, не те события отслеживаю (мне нужно отследить движение, а не его окончание). Подскажите, как решить. Кстати, может есть какой управляющий компонент, который делает нечто подобное (просто я за сплитер зацепился).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.