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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отрисовка бордера по границам LayoutManager'а 
V
    Опции темы
mgarin
Дата 21.10.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот возникла интересная задача, опишу поподробнее...

Предположим есть некий использованный для панели LayoutManager:
Код
        JPanel panel = new JPanel ();
        TableLayout tableLayout = new TableLayout (
                new double[][]{ { TableLayout.FILL, TableLayout.FILL },
                        { TableLayout.FILL, TableLayout.FILL } } );
        tableLayout.setHGap ( 5 );
        tableLayout.setVGap ( 5 );
        panel.setLayout ( tableLayout );


Собственно, задача такова - отрисовать бордеры в данной панели по краям указанным для компонентов использованным LayoutManager'ом - в данном случае TableLayout (но впринципе может быть и другой).

Что бы стало более понятно о чем речь, приведу кусок HTML кода, в котором данная задача выполнена:
Код
<table width="100%" border="1" cellspacing="5" bordercolor="#FF0000">
  <tr width="50%"><td width="50%">1</td><td width="50%">2</td></tr>
  <tr width="50%"><td width="50%">3</td><td width="50%">4</td></tr>
</table>


Конечно, это немного не тот бордер что я захочу отрисовать, но как вариант - тоже сойдет. (От него можно будет плясать дальше, по крайней мере)


Собственно, в данной задаче есть несколько проблем - сам LayoutManager по сути не может отдать координаты компонентов, 
он лишь позволяет их добавлять в контейнер по некоторым константам понятным ему.
Контейнер, в свою очередь, не может выдать координаты тех частей в лэйауте, куда не были вставлены какие-либо компоненты

Получается, необходимо будет шпиговать в контейнер пустые объекты, только лишь ради отрисовки бордера?
Или переписывать LayoutManager под себя, чтобы была возможность получить координаты?
Что-то это не похоже на оптимальные варианты, с чего собственно и возник данный вопрос
PM MAIL WWW ICQ   Вверх
Skipy
Дата 21.10.2010, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

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



Не совсем понятно, о каких "тех частей в лэйауте, куда не были вставлены какие-либо компоненты" идет речь. Очень бы помог визуальный пример. 

Приведенный HTML дает таблицу 2х2 без каких-либо пропусков. В таком случае кто Вам мешает получить из контейнера все компоненты и выставить им рамки?

В общем, не совсем понятна задача.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
mgarin
Дата 21.10.2010, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Skipy @  21.10.2010,  17:19 Найти цитируемый пост)
Не совсем понятно, о каких "тех частей в лэйауте, куда не были вставлены какие-либо компоненты" идет речь. Очень бы помог визуальный пример. 

Приведенный HTML дает таблицу 2х2 без каких-либо пропусков. В таком случае кто Вам мешает получить из контейнера все компоненты и выставить им рамки?

В общем, не совсем понятна задача. 


Да, HTML вероятно не лучший пример.
А заполнил я всю таблицу чисто для корректного отображения, 
в Java же не факт что каждая ячейка будет содержать компонент. (это как раз к "о каких "тех частей в лэйауте, куда не были вставлены какие-либо компоненты" идет речь")

Приведу несколько скринов:

1) Так выглядит лэйаут (3х2, TableLayout, все ячейки TableLayout.FILL) - в некотором графическом редакторе для Swing (не суть):
user posted image

2) Так выглядит его обычный просмотр в обычном JFrame'е:
user posted image

3) А вот та самая сетка (или бордер, или граница, или кайма - называйте как угодно), которая мне нужна: (Photoshopped)
user posted image

Сразу скажу, я умею работать с Graphics, могу спокойно нарисовать любой коспонент с нуля - с этим помощь не понадобится,
тут проблема состоит в том, чтобы понять, как же мне определить координаты для данной сетки

P.S. Надеюсь теперь суть ясна

Это сообщение отредактировал(а) mgarin - 21.10.2010, 19:35
PM MAIL WWW ICQ   Вверх
Skipy
Дата 22.10.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

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



Ох... Боюсь, без вмешательства в Layout manager это не получится. Либо второй вариант, Вами же озвученный, - вставлять заполнители. Например, непрозрачные, а фон сделать цветным, толга только в промежутках между компонентами он и будет светиться.

UPD. Кстати, посмотрел сейчас на API. Я правильно понимаю - https://tablelayout.dev.java.net/ ?

Так вот, всё внутреннее состояние менеджера - protected. Наследуетесь от него, делаете методы для получения размеров ячеек - что-то мне подсказывает, что crSize и crOffset будет достаточно для Ваших целей. И всё, после изменения размеров компоненты вызываете doLayout, а дальше из менеджера считываете все координаты и устанавливаете их в свою панель для отрисовки сетки.

Это сообщение отредактировал(а) Skipy - 22.10.2010, 10:24


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
mgarin
Дата 22.10.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Skipy @  22.10.2010,  10:24 Найти цитируемый пост)
Ох... Боюсь, без вмешательства в Layout manager это не получится. Либо второй вариант, Вами же озвученный, - вставлять заполнители. Например, непрозрачные, а фон сделать цветным, толга только в промежутках между компонентами он и будет светиться.

Это как раз то, чего хочется избежать)

Цитата(Skipy @  22.10.2010,  10:24 Найти цитируемый пост)
UPD. Кстати, посмотрел сейчас на API. Я правильно понимаю - https://tablelayout.dev.java.net/ ?

Именно оно.

Цитата(Skipy @  22.10.2010,  10:24 Найти цитируемый пост)
Так вот, всё внутреннее состояние менеджера - protected. Наследуетесь от него, делаете методы для получения размеров ячеек - что-то мне подсказывает, что crSize и crOffset будет достаточно для Ваших целей. И всё, после изменения размеров компоненты вызываете doLayout, а дальше из менеджера считываете все координаты и устанавливаете их в свою панель для отрисовки сетки.

А вот это можно сказать "Bingo!" smile
Большое спасибо, что-то 
Код
    protected int[][] crSize;
    protected int[][] crOffset;

я сначала не заметил там.

Впринципе, я и TableLayout'ом обойдусь на самом деле smile
На его основе можно и все остальное сделать

PM MAIL WWW ICQ   Вверх
mgarin
Дата 22.10.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Собственно, вот решение:
Код
import com.alee.designer.objects.standart.Layout.ExtTableLayout;
import info.clearthought.layout.TableLayout;

import javax.swing.*;
import java.awt.*;

/**
 * User: mgarin Date: 22.10.2010 Time: 12:24:06
 */

public class ExtTableLayoutTest extends JFrame
{
    public ExtTableLayoutTest ()
    {
        super ();

        final ExtTableLayout extTableLayout = new ExtTableLayout (
                new double[][]{ { 50, TableLayout.FILL, TableLayout.PREFERRED },
                        { TableLayout.FILL, 100, TableLayout.FILL } } );
        extTableLayout.setHGap ( 3 );
        extTableLayout.setVGap ( 3 );
        JPanel panel = new JPanel()
        {
            protected void paintComponent ( Graphics g )
            {
                super.paintComponent ( g );

                Graphics2D g2d = ( Graphics2D ) g;

                g2d.setColor ( Color.BLACK );

                int[][] sizes = extTableLayout.getCrSize ();
                int hGap = extTableLayout.getHGap ();
                int vGap = extTableLayout.getVGap ();
                Insets insets = getBorder () != null ? getBorder ().getBorderInsets ( this ) :
                        new Insets ( 0, 0, 0, 0 );

                int leftGap = insets.left - 1 - Math.min ( hGap, insets.left ) / 2;
                int topGap = insets.top - 1 - Math.min ( vGap, insets.top ) / 2;

                int rightEnd = insets.left;
                for ( int cellWidth : sizes[ 0 ] )
                {
                    rightEnd += cellWidth + hGap;
                }
                rightEnd += -hGap + Math.min ( hGap, insets.right ) / 2;
                int bottomEnd = insets.top;
                for ( int cellHeight : sizes[ 1 ] )
                {
                    bottomEnd += cellHeight + vGap;
                }
                bottomEnd += -vGap + Math.min ( vGap, insets.bottom ) / 2;

                int number;
                int fix;
                int i;

                number = 0;
                i = insets.left - 1;
                for ( int cellWidth : sizes[ 0 ] )
                {
                    if ( number == 0 )
                    {
                        fix = Math.min ( hGap, insets.left ) / 2;
                    }
                    else
                    {
                        fix = hGap / 2;
                    }
                    g2d.drawLine ( i - fix, topGap, i - fix, bottomEnd );
                    i += cellWidth + hGap;
                    number++;
                }
                g2d.drawLine ( i - hGap + 1 + Math.min ( hGap, insets.right ) / 2, topGap,
                        i - hGap + 1 + Math.min ( hGap, insets.right ) / 2, bottomEnd );

                number = 0;
                i = insets.top - 1;
                for ( int cellHeight : sizes[ 1 ] )
                {
                    if ( number == 0 )
                    {
                        fix = Math.min ( vGap, insets.top ) / 2;
                    }
                    else
                    {
                        fix = vGap / 2;
                    }
                    g2d.drawLine ( leftGap, i - fix, rightEnd, i - fix );
                    i += cellHeight + vGap;
                    number++;
                }
                g2d.drawLine ( leftGap, i - vGap + 1 + Math.min ( vGap, insets.bottom ) / 2,
                        rightEnd, i - vGap + 1 + Math.min ( vGap, insets.bottom ) / 2 );
            }
        };
        panel.setBorder ( BorderFactory.createEmptyBorder ( 3, 3, 3, 3 ) );
        panel.setLayout ( extTableLayout );

        panel.add ( new JButton ( "!" ), "0,0" );
        //        panel.add ( new JButton ( "!" ), "1,0" );
        panel.add ( new JButton ( "!" ), "2,0" );
        //        panel.add ( new JButton ( "!" ), "0,1" );
        panel.add ( new JButton ( "!" ), "1,1" );
        //        panel.add ( new JButton ( "!" ), "2,1" );
        //        panel.add ( new JButton ( "!" ), "0,2" );
        //        panel.add ( new JButton ( "!" ), "1,2" );
        //        panel.add ( new JButton ( "!" ), "2,2" );

        getContentPane ().add ( panel, BorderLayout.CENTER );

        setSize ( 430, 430 );
        setLocationRelativeTo ( null );
        setVisible ( true );
    }

    public static void main ( String agrs[] )
    {
        new ExtTableLayoutTest ();
    }
}


И небольшое дополнение к TableLayout'у:
Код
import info.clearthought.layout.TableLayout;

/**
 * User: mgarin Date: 22.10.2010 Time: 12:44:08
 */

public class ExtTableLayout extends TableLayout
{
    public ExtTableLayout ()
    {
        super ();
    }

    public ExtTableLayout ( double[][] doubles )
    {
        super ( doubles );
    }

    public ExtTableLayout ( double[] doubles, double[] doubles1 )
    {
        super ( doubles, doubles1 );
    }

    public int[][] getCrSize ()
    {
        return crSize;
    }

    public int[][] getCrOffset ()
    {
        return crOffset;
    }
}


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

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

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


 




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


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

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