powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с отображением многоуровневых заголовков таблицы
5 сообщений из 5, страница 1 из 1
Проблемы с отображением многоуровневых заголовков таблицы
    #37735371
LedFly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Задумал использовать таблицу с многоуровневым заголовком, но вот беда, если заголовок формировать при запуске приложения, все отображается как надо:


а если пытаться сформировать его находу, по комманде пользователя, ничего не происходит:


Собственно вот так вызывается формирование многоуровневого заголовка для таблицы
Код: java
1.
header = new GroupTableHeader(jTable1);



а вот сам GroupTableHeader
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tki_db;

import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;
import java.util.ArrayList;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.JTableHeader;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JComponent;
import javax.swing.SwingConstants;
import javax.swing.plaf.basic.BasicTableHeaderUI;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import tki_db.dbGroupTableHeader.ColumnGroup.GroupableTableHeader;

/**
 *
 * @author 1
 */
public class dbGroupTableHeader {

    private final JTable table;

    public dbGroupTableHeader(JTable table) {
        this.table = table;
        DefaultTableModel dm = new DefaultTableModel();
        dm.setDataVector(new Object[][]{
                    {"119", "Finbar", "John", "Saunders", "ja", "ko", "zh"},
                    {"911", "Roger", "Peter", "Melly", "en", "fr", "pt"}},
                new Object[]{"Тип", "Ф", "Р", "Модель", "Назначение", "<html><p align=center>Усилие<br>пресса, кН", "<html><p align=center>Деформирующее<br>давление, МПа", "<html><p align=center>Высота<br>штампуемой<br>детали", "<html><p align=center>Число<br>столов", "Ширина", "Длина", "Ширина", "Длина", "Высота", "Ширина", "Длина", "Высота", "Дополнительно"});

        // Setup table
        table.setColumnModel(new GroupableTableColumnModel());
        table.setTableHeader(new GroupableTableHeader((GroupableTableColumnModel) table.getColumnModel()));
        table.setModel(dm);
        table.setAutoCreateRowSorter(true);
        // Setup Column Groups
        GroupableTableColumnModel cm = (GroupableTableColumnModel) table.getColumnModel();
        ColumnGroup g_name = new ColumnGroup(new GroupableTableGreenCellRenderer(), "Общие характеристики");
        g_name.add(cm.getColumn(0));
        //    g_name.add(cm.getColumn(1));
        ColumnGroup g_token = new ColumnGroup("Тип операций");
        g_name.add(g_token);
        g_token.add(cm.getColumn(1));
        g_token.add(cm.getColumn(2));
        g_name.add(cm.getColumn(3));
        g_name.add(cm.getColumn(4));
        ColumnGroup g_lang = new ColumnGroup(new GroupableTableBlueCellRenderer(), "Характеристики прессов");
        g_lang.add(cm.getColumn(5));
        g_lang.add(cm.getColumn(6));
        g_lang.add(cm.getColumn(7));
        g_lang.add(cm.getColumn(8));
        ColumnGroup g_other = new ColumnGroup("Размеры стола, мм");
        g_other.add(cm.getColumn(9));
        g_other.add(cm.getColumn(10));
        ColumnGroup g_other2 = new ColumnGroup("Размеры формблока, мм");
        g_other2.add(cm.getColumn(11));
        g_other2.add(cm.getColumn(12));
        g_other2.add(cm.getColumn(13));
        ColumnGroup g_other3 = new ColumnGroup("Габариты, мм");
        g_other3.add(cm.getColumn(14));
        g_other3.add(cm.getColumn(15));
        g_other3.add(cm.getColumn(16));
        // cm.getColumn(6).setHeaderRenderer(new GroupableTableBlueCellRenderer());
        g_lang.add(g_other);
        g_lang.add(g_other2);
        g_lang.add(g_other3);
        g_lang.add(cm.getColumn(17));
        GroupableTableHeader header = (GroupableTableHeader) table.getTableHeader();
        table.setTableHeader(header);
        cm.addColumnGroup(g_name);
        cm.addColumnGroup(g_lang);
    }    

    /**
     * Demo renderer just to prove they can be used.
     */
    class GroupableTableGreenCellRenderer extends DefaultTableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean selected, boolean focused, int row, int column) {
            if (table != null) {
                JTableHeader header = table.getTableHeader();
                if (header != null) {
                    setForeground(Color.BLACK);
                    setBackground(new Color(146, 208, 80));
                }
            }
            setHorizontalAlignment(SwingConstants.CENTER);
            setText(value != null ? value.toString() : " ");
            setBorder(UIManager.getBorder("TableHeader.cellBorder"));
            return this;
        }
    }

    class GroupableTableBlueCellRenderer extends DefaultTableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean selected, boolean focused, int row, int column) {
            if (table != null) {
                JTableHeader header = table.getTableHeader();
                if (header != null) {
                    setForeground(Color.BLACK);
                    setBackground(new Color(0, 176, 240));
                }
            }
            setHorizontalAlignment(SwingConstants.CENTER);
            setText(value != null ? value.toString() : " ");
            setBorder(UIManager.getBorder("TableHeader.cellBorder"));
            return this;
        }
    }

    public static class GroupableTableHeaderUI extends BasicTableHeaderUI {

        /**
         * Contains a list of ColumnGroups that have already been painted
         * in the current paint request.
         */
        protected Vector paintedGroups = new Vector();

        /**
         * Paint a representation of the table header.
         * @param g the Graphics context in which to paint
         * @param c the component being painted; this argument is often ignored
         */
        public void paint(Graphics g, JComponent c) {
            Rectangle clipBounds = g.getClipBounds();
            GroupableTableColumnModel cm = (GroupableTableColumnModel) header.getColumnModel();
            if (cm == null) {
                return;
            }
            ((GroupableTableHeader) header).setColumnMargin();
            int column = 0;
            Dimension size = header.getSize();
            Rectangle cellRect = new Rectangle(0, 0, size.width, size.height);
            Hashtable h = new Hashtable();
            int columnMargin = cm.getColumnMargin();

            Enumeration columns = cm.getColumns();
            while (columns.hasMoreElements()) {
                cellRect.height = size.height;
                cellRect.y = 0;
                TableColumn aColumn = (TableColumn) columns.nextElement();
                Iterator colGrpIter = cm.getColumnGroups(aColumn);
                if (colGrpIter != null) {
                    int groupHeight = 0;
                    while (colGrpIter.hasNext()) {
                        ColumnGroup cGroup = (ColumnGroup) colGrpIter.next();
                        Rectangle groupRect = (Rectangle) h.get(cGroup);
                        if (groupRect == null) {
                            groupRect = new Rectangle(cellRect);
                            Dimension d = cGroup.getSize(header.getTable());
                            groupRect.width = d.width;
                            groupRect.height = d.height;
                            h.put(cGroup, groupRect);
                        }
                        if (!paintedGroups.contains(cGroup)) {
                            paintCell(g, groupRect, cGroup);
                            paintedGroups.add(cGroup);
                        }
                        groupHeight += groupRect.height;
                        cellRect.height = size.height - groupHeight;
                        cellRect.y = groupHeight;
                    }
                }
                cellRect.width = aColumn.getWidth();
                if (cellRect.intersects(clipBounds)) {
                    paintCell(g, cellRect, column);
                }
                cellRect.x += cellRect.width;
                column++;
            }
            paintedGroups.clear();
        }

        /**
         * Paints a header column cell.
         * @param g Graphics context
         * @param cellRect The rectangle to contain the cell
         * @param columnIndex The header column to be painted
         */
        private void paintCell(Graphics g, Rectangle cellRect, int columnIndex) {
            TableColumn aColumn = header.getColumnModel().getColumn(columnIndex);
            TableCellRenderer renderer = aColumn.getHeaderRenderer();
            if (renderer == null) {
                renderer = header.getDefaultRenderer();
            }
            Component component = renderer.getTableCellRendererComponent(
                    header.getTable(), aColumn.getHeaderValue(), false, false, -1, columnIndex);
            rendererPane.add(component);
            rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y,
                    cellRect.width, cellRect.height, true);
        }

        /**
         * Paint group column cell.
         * @param g Graphics context
         * @param cellRect Rectangle that the cell with be painted in
         * @param cGroup Current column group
         */
        private void paintCell(Graphics g, Rectangle cellRect, ColumnGroup cGroup) {
            TableCellRenderer renderer = cGroup.getHeaderRenderer();
            Component component = renderer.getTableCellRendererComponent(
                    header.getTable(), cGroup.getHeaderValue(), false, false, -1, -1);
            rendererPane.add(component);
            rendererPane.paintComponent(g, component, header, cellRect.x, cellRect.y,
                    cellRect.width, cellRect.height, true);
        }

        /**
         * Calculate and return the height of the header.
         * @return Header Height
         */
        private int getHeaderHeight() {
            int height = 0;
            GroupableTableColumnModel columnModel = (GroupableTableColumnModel) header.getColumnModel();
            for (int column = 0; column < columnModel.getColumnCount(); column++) {
                TableColumn aColumn = columnModel.getColumn(column);
                TableCellRenderer renderer = aColumn.getHeaderRenderer();
                if (renderer == null) {
                    renderer = header.getDefaultRenderer();
                }
                Component comp = renderer.getTableCellRendererComponent(
                        header.getTable(), aColumn.getHeaderValue(), false, false, -1, column);
                int cHeight = comp.getPreferredSize().height;
                Iterator iter = columnModel.getColumnGroups(aColumn);
                if (iter != null) {
                    while (iter.hasNext()) {
                        ColumnGroup cGroup = (ColumnGroup) iter.next();
                        cHeight += cGroup.getSize(header.getTable()).height;
                    }
                }
                height = Math.max(height, cHeight);
            }
            return height;
        }

        /**
         * Calculate and return the dimension of the header.
         * @param width Starting width to be used.
         * @return Dimension of the header
         */
        private Dimension createHeaderSize(long width) {
            TableColumnModel columnModel = header.getColumnModel();
            width += columnModel.getColumnMargin() * columnModel.getColumnCount();
            if (width > Integer.MAX_VALUE) {
                width = Integer.MAX_VALUE;
            }
            return new Dimension((int) width, getHeaderHeight());
        }

        /**
         * Invokes the getPreferredSize method on each UI handled by this object.
         * @param c the component whose preferred size is being queried; this argument is ignored.
         * @return the dimension of the whole header
         */
        public Dimension getPreferredSize(JComponent c) {
            long width = 0;
            Enumeration columns = header.getColumnModel().getColumns();
            while (columns.hasMoreElements()) {
                TableColumn aColumn = (TableColumn) columns.nextElement();
                width = width + aColumn.getPreferredWidth();
            }
            return createHeaderSize(width);
        }
    }

    public static class ColumnGroup {

        /**
         * Cell renderer for group header.
         */
        protected TableCellRenderer renderer;
        /**
         * Holds the TableColumn or ColumnGroup objects contained
         * within this ColumnGroup instance.
         */
        protected Vector v;
        /**
         * The ColumnGroup instance name.
         */
        protected String text;
        /**
         * The margin to use for renderering.
         */
        protected int margin = 0;

        /**
         * Standard ColumnGroup constructor.
         * @param text Name of the ColumnGroup which will be displayed
         * when the ColumnGroup is renderered.
         */
        public ColumnGroup(String text) {
            this(null, text);
        }

        /**
         * Standard ColumnGroup constructor.
         * @param renderer a TableCellRenderer for the group.
         * @param text Name of the ColumnGroup which will be displayed
         * when the ColumnGroup is renderered.
         */
        public static class GroupableTableHeader extends JTableHeader {

            /**
             * Identifies the UI class which draws the header.
             */
            private static final String uiClassID = "GroupableTableHeaderUI";

            /**
             * Constructs a GroupableTableHeader which is initialized with cm as the
             * column model. If cm is null this method will initialize the table header
             * with a default TableColumnModel.
             * @param model the column model for the table
             */
            public GroupableTableHeader(GroupableTableColumnModel model) {
                super(model);
                setUI(new GroupableTableHeaderUI());
                setReorderingAllowed(false);
            }

            /**
             * Sets the margins correctly for all groups within
             * the header.
             */
            public void setColumnMargin() {
                int columnMargin = getColumnModel().getColumnMargin();
                Iterator iter = ((GroupableTableColumnModel) columnModel).columnGroupIterator();
                while (iter.hasNext()) {
                    ColumnGroup cGroup = (ColumnGroup) iter.next();
                    cGroup.setColumnMargin(columnMargin);
                }
            }
        }

        public ColumnGroup(TableCellRenderer renderer, String text) {
            if (renderer == null) {
                this.renderer = new DefaultTableCellRenderer() {

                    public Component getTableCellRendererComponent(JTable table, Object value,
                            boolean isSelected, boolean hasFocus, int row, int column) {
                        if (table != null) {
                            JTableHeader header = table.getTableHeader();
                            if (header != null) {
                                setForeground(header.getForeground());
                                setBackground(header.getBackground());
                                setFont(header.getFont());
                            }
                        }
                        setHorizontalAlignment(JLabel.CENTER);
                        setText((value == null) ? "" : value.toString());
                        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
                        return this;
                    }
                };
            } else {
                this.renderer = renderer;
            }
            this.text = text;
            v = new Vector();
        }

        /**
         * Add a TableColumn or ColumnGroup object to the
         * ColumnGroup instance.
         * @param obj TableColumn or ColumnGroup
         */
        public void add(Object obj) {
            if (obj == null) {
                return;
            }
            v.addElement(obj);
        }

        /**
         * Get the ColumnGroup list containing the required table
         * column.
         * @param g vector to populate with the ColumnGroup/s
         * @param c TableColumn
         * @return Vector containing the ColumnGroup/s
         */
        public Vector getColumnGroups(TableColumn c, Vector g) {
            g.addElement(this);
            if (v.contains(c)) {
                return g;
            }
            Iterator iter = v.iterator();
            while (iter.hasNext()) {
                Object obj = iter.next();
                if (obj instanceof ColumnGroup) {
                    Vector groups =
                            (Vector) ((ColumnGroup) obj).getColumnGroups(c, (Vector) g.clone());
                    if (groups != null) {
                        return groups;
                    }
                }
            }
            return null;
        }

        /**
         * Returns the TableCellRenderer for the ColumnGroup.
         * @return the TableCellRenderer
         */
        public TableCellRenderer getHeaderRenderer() {
            return renderer;
        }

        /**
         * Set the TableCellRenderer for this ColumnGroup.
         * @param renderer the renderer to use
         */
        public void setHeaderRenderer(TableCellRenderer renderer) {
            if (renderer != null) {
                this.renderer = renderer;
            }
        }

        /**
         * Get the ColumnGroup header value.
         * @return the value.
         */
        public Object getHeaderValue() {
            return text;
        }

        /**
         * Get the dimension of this ColumnGroup.
         * @param table the table the header is being rendered in
         * @return the dimension of the ColumnGroup
         */
        public Dimension getSize(JTable table) {
            Component comp = renderer.getTableCellRendererComponent(
                    table, getHeaderValue(), false, false, -1, -1);
            int height = comp.getPreferredSize().height;
            int width = 0;
            Iterator iter = v.iterator();
            while (iter.hasNext()) {
                Object obj = iter.next();
                if (obj instanceof TableColumn) {
                    TableColumn aColumn = (TableColumn) obj;
                    width += aColumn.getWidth();
                } else {
                    width += ((ColumnGroup) obj).getSize(table).width;
                }
            }
            return new Dimension(width, height);
        }

        /**
         * Sets the margin that ColumnGroup instance will use and all
         * held TableColumns and/or ColumnGroups.
         * @param margin the margin
         */
        public void setColumnMargin(int margin) {
            this.margin = margin;
            Iterator iter = v.iterator();
            while (iter.hasNext()) {
                Object obj = iter.next();
                if (obj instanceof ColumnGroup) {
                    ((ColumnGroup) obj).setColumnMargin(margin);
                }
            }
        }
    }

    public static class GroupableTableColumnModel extends DefaultTableColumnModel {

        /**
         * Hold the list of ColumnGroups which define what group each normal
         * column is within, if any.
         */
        protected ArrayList columnGroups = new ArrayList();

        /**
         * Add a new columngroup.
         * @param columnGroup new ColumnGroup
         */
        public void addColumnGroup(ColumnGroup columnGroup) {
            columnGroups.add(columnGroup);
        }

        /**
         * Provides an Iterator to iterate over the
         * ColumnGroup list.
         * @return Iterator over ColumnGroups
         */
        public Iterator columnGroupIterator() {
            return columnGroups.iterator();
        }

        /**
         * Returns a ColumnGroup specified by an index.
         * @param index index of ColumnGroup
         * @return ColumnGroup
         */
        public ColumnGroup getColumnGroup(int index) {
            if (index >= 0 && index < columnGroups.size()) {
                return (ColumnGroup) columnGroups.get(index);
            }
            return null;
        }

        /**
         * Provides and iterator for accessing the ColumnGroups
         * associated with a column.
         * @param col Column
         * @return ColumnGroup iterator
         */
        public Iterator getColumnGroups(TableColumn col) {
            if (columnGroups.isEmpty()) {
                return null;
            }
            Iterator iter = columnGroups.iterator();
            while (iter.hasNext()) {
                ColumnGroup cGroup = (ColumnGroup) iter.next();
                Vector v_ret = (Vector) cGroup.getColumnGroups(col, new Vector());
                if (v_ret != null) {
                    return v_ret.iterator();
                }
            }
            return null;
        }
    }
}



Подскажите, в чем может быть проблема? Пробовал c UIManager шаманить- безрезультатно.
...
Рейтинг: 0 / 0
Проблемы с отображением многоуровневых заголовков таблицы
    #37735591
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LedFly,
Код: java
1.
2.
3.
4.
5.
6.
7.
	@Override
	public void updateUI()
	{
		setUI(new GroupableTableHeaderUI);
		resizeAndRepaint();
		invalidate();
	}


не помогает?
...
Рейтинг: 0 / 0
Проблемы с отображением многоуровневых заголовков таблицы
    #37737552
LedFly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexJm,

нет, не помогает.
Причем я обнаружил что GroupableTableHeader перекрывается JTableHeader ...
На каком этапе это происходит, не понятно.
...
Рейтинг: 0 / 0
Проблемы с отображением многоуровневых заголовков таблицы
    #37737556
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LedFlyAlexJm,

нет, не помогает.
Причем я обнаружил что GroupableTableHeader перекрывается JTableHeader ...
На каком этапе это происходит, не понятно.

если я правильно понимаю, то стандартный Header может присваивается при создании дефолтной TableColumnModel, т.е.
в режиме table.setAutoCreateColumnsFromModel(true)
...
Рейтинг: 0 / 0
Проблемы с отображением многоуровневых заголовков таблицы
    #37737560
AlexJm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexJmLedFlyAlexJm,

нет, не помогает.
Причем я обнаружил что GroupableTableHeader перекрывается JTableHeader ...
На каком этапе это происходит, не понятно.

если я правильно понимаю, то стандартный Header может присваивается при создании дефолтной TableColumnModel, т.е.
в режиме table.setAutoCreateColumnsFromModel(true)

хотя нет, не должен.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблемы с отображением многоуровневых заголовков таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]