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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как построить следующий контрол 
V
    Опции темы
Ccoder
Дата 15.2.2011, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Использую NetBeans.
Мне нужно как-то реализовать следующий компонент.
Вот так он должен выглядеть
user posted image
Хочу так отображать память (по три байта). При этом во время выполнения программы память меняется.
Полностью незнаю с чего начать.
Подскажите пожалуйста, как тут что.
PM MAIL   Вверх
_Y_
Дата 15.2.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



Выглядит как обычная таблица (JTable). Таблица чем-то не устраивает?


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Ccoder
Дата 16.2.2011, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Уже начал использовать. Мнебы только ещё по бокам числа сделать. Ну в принце если очень сложното обойдусь, пардон.
PM MAIL   Вверх
techmax
Дата 16.2.2011, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



создание заголовка для строк: 
http://www.java2s.com/Code/Java/Swing-Comp...aderExample.htm
PM MAIL Skype   Вверх
_Y_
Дата 16.2.2011, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

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



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

В этом случае в первую колонку модель будет отдавать номера рядов. Рендерер, соответственно, будет их выводить в нужном формате.

Но это дело вкуса, конечно.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Ccoder
Дата 19.3.2011, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Слушайте, подскажите пожалуйста ктонибудь

Я просмотрел код приведённый выше, этот http://www.java2s.com/Code/Java/Swing-Comp...aderExample.htm.
и вот немогу никак его приспособить под свой код.

Попробую объяснить что я хочу сделать:
У меня на форме лежит JTable в JScrollPane (я работаю с NetBeans). В этой таблице у меня отображается некий дамп памяти. И сверху я могу сделать tabsы используя визуальный редактор, а сбоку как я понял можно сделать программно, только я пока что не понял как.
Вот так это всё выглядит
user posted image
(красным я пометил что я имею ввиду, т.е. на этом месте я хочу увидеть тоже самое что и с верху)
В том коде который был выше, сам JTable создаётся программно, а у меня он создаётся автоматически (сгенерированным кодом).

Добавлено @ 18:26
Другими словами хочу сделать что-то на подобии excel.

Добавлено @ 18:30
Вот такой примерно конечный вариант, (сбоку тоесть хочу сделать tabs'ы)
user posted image

Добавлено @ 18:33
В том примере который выше очень всё запутано, может кто-нибудь прояснит ситуацию smile

Это сообщение отредактировал(а) Ccoder - 19.3.2011, 18:38
PM MAIL   Вверх
Ccoder
Дата 19.3.2011, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну вот я нашел ещё в другом месте это дело http://lib.juga.ru/article/view/210/
только вот проблема в том что я не хочу делать наследование JTable, так как я кладу сам компонент с визуальным редактором.
Можно-ли как-то обойти это дело? И подойти по другому?
PM MAIL   Вверх
esivres
Дата 20.3.2011, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Первое что приходит в голову. Это в модели таблицы не использовать первый столбец.
А в конструкторе формы добавить следующий код:

Код

   jTable1.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() {
            JLabel txt = new JLabel();

            {
                txt.setBackground(Color.LIGHT_GRAY);
                txt.setOpaque(true);
                txt.setBorder(new EtchedBorder());
            }
            
public Component getTableCellRendererComponent(JTable jtable, Object o, boolean bln, boolean bln1, int i, int i1) {
                txt.setText(String.valueOf(i));
                return txt;
            }
        });


Надеюсь пригодитсяsmile

PM MAIL   Вверх
jk1
Дата 21.3.2011, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

только вот проблема в том что я не хочу делать наследование JTable, так как я кладу сам компонент с визуальным редактором.


А в чем проблема добавить свой унаследованный от JTable компонент на палитру визуального редактора?


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Ccoder
Дата 22.3.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Слушайте мне всё-таки очень интересно узнать, как сделать что-бы сбоку эта панель была похожа на JTableHeader
Тоесть что-то на подобии
user posted image
а при наведении курсора на какой-нибудь элемент (например 3)
user posted image
(это я в paintе нарисовал)

Например можно с JScrollом лежащим под JTable сделать
Код

jScroll.setRowHeaderView(new RowHeaderRenderer(jTable));

Код

class RowHeaderRenderer extends JPanel
{
    public RowHeaderRenderer(JTable table)
    {
       //а тут узнать высоту одной клетки и выложить этот JPanel кнопками, только как натянуть на них "шкурку" (skin) от JTableHeader?
    }

или у кого-нибудь какие ещё идеи приходят в голову

P.S.
Сам JTableHeader никак повернуть мне не удалось.

Это сообщение отредактировал(а) Ccoder - 22.3.2011, 21:41
PM MAIL   Вверх
esivres
Дата 23.3.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Его и не получится перевернуть, он так не умеетsmile Если рассматривать предложенный мной вариант, то можно сделать компонент унаследованный от JLabel такого типа: 
Код

  public static class Index extends JLabel {

        private int index;
        private boolean selected;

        public Index(JTableHeader head) {
            super.setText("");
            this.setFont(head.getFont());
            this.setBorder(head.getBorder());
            this.setForeground(head.getForeground());
            this.setBackground(head.getBackground());
            this.setOpaque(true);
        }

        public void setIndex(int index) {
            this.index = index;
        }


        @Override
        public void paint(Graphics grphcs) {
            super.paint(grphcs);

            Graphics2D gr = (Graphics2D) grphcs;
            Dimension dm = this.getSize();
            String str = String.format("%2x", index);
            gr.setFont(this.getFont());
            Rectangle2D rec = gr.getFont().getStringBounds(str, gr.getFontRenderContext());
            gr.rotate(-Math.PI/2);
            gr.drawString(str, -(float)rec.getWidth(), dm.height);
            gr.rotate(Math.PI/2);
        };
    };


и им заменить  JLabel в моем примере. Из недостатков, у меня ограничение по высоте в два символа.  больше просто невлезит. Вообще в случае если вам необходимо написать компонент который будет показывать 16 ричные данные то лучше реализовать свой собственный компонент от начала и до конца, это принесет на много больше пользы чем попытки прикрутить к таблице не свойственный ей функционал.


Это сообщение отредактировал(а) esivres - 23.3.2011, 13:02
PM MAIL   Вверх
pathfinder
Дата 23.3.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.CellRendererPane;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class JTableRowHeader extends JComponent {

    public JTableRowHeader(JTable table) {
        this.table = table;

        rendererPane = new CellRendererPane();
        add(rendererPane);
        
        table.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                adjustPreferredSize();
                revalidate();
                repaint();
            }
        });
        table.getTableHeader().addPropertyChangeListener("UI", new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent evt) {
                adjustCellRenderer();
            }
        });

        adjustPreferredSize();
        adjustCellRenderer();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Rectangle clipBounds = g.getClipBounds();
        int rowMin = table.rowAtPoint(new Point(1, clipBounds.y));
        int rowMax = table.rowAtPoint(new Point(1, clipBounds.y+clipBounds.height));

        if (rowMin < 0) {
            rowMin = 0;
        }

        if (rowMax < 0) {
            rowMax = table.getRowCount()-1;
        }

        Rectangle cellRect = new Rectangle();
        cellRect.x = 0;
        cellRect.y = table.getCellRect(rowMin, 0, true).y;
        cellRect.width = getWidth();

        for (int i=rowMin; i<=rowMax; i++) {
            cellRect.height = table.getRowHeight(i);

            rendererPane.paintComponent(g, 
                    cellRenderer.getTableCellRendererComponent(table, i, false, false, i, 0),
                    this, cellRect);

            cellRect.y += cellRect.height;
        }
    }

    private void adjustPreferredSize() {
        setPreferredSize(new Dimension(40, table.getPreferredSize().height));
    }

    private void adjustCellRenderer() {
        cellRenderer = table.getTableHeader().getDefaultRenderer();
    }

    /* DATA */
    JTable table;
    CellRendererPane rendererPane;
    TableCellRenderer cellRenderer;

}



PM MAIL   Вверх
Ccoder
Дата 23.3.2011, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Что-то эти коды ничего не дают (а как у Вас? работают?)
Первый не запускается изза ошибок.
Второй не даёт никакого результата.

Это сообщение отредактировал(а) Ccoder - 23.3.2011, 21:20
PM MAIL   Вверх
pathfinder
Дата 24.3.2011, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Бывалый
*


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

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



pathfinder
тут вроде-бы только темы меняються, а если сделать "Windows" тему то всёравно нету.
Тоесть боковая панель имеет вид другой нежели панель на верху.
(забыл упомянуть что я Windows тему использую)

А как можно на простой JPanel или JButton тогда натянуть шкурку (сделать такого самого вида что и элемент из JTableHeader)
Тоесть user posted image, а при наведении мышки user posted image

Добавлено @ 13:27
Вообще возможно-ли как-то получить доступ к "шкурке" от JTableHeader элемента?

Это сообщение отредактировал(а) Ccoder - 24.3.2011, 13:31
PM MAIL   Вверх
pathfinder
Дата 24.3.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Исправленный JTableRowHeader

Код

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.CellRendererPane;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class JTableRowHeader extends JPanel {

    public JTableRowHeader(JTable table) {
        this.table = table;

        rendererPane = new CellRendererPane();
        add(rendererPane);
        
        table.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                adjustPreferredSize();
                revalidate();
                repaint();
            }
        });
        
        adjustPreferredSize();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Rectangle clipBounds = g.getClipBounds();
        int rowMin = table.rowAtPoint(new Point(1, clipBounds.y));
        int rowMax = table.rowAtPoint(new Point(1, clipBounds.y+clipBounds.height));

        if (rowMin < 0) {
            rowMin = 0;
        }

        if (rowMax < 0) {
            rowMax = table.getRowCount()-1;
        }

        Rectangle cellRect = new Rectangle();
        cellRect.x = 0;
        cellRect.y = table.getCellRect(rowMin, 0, true).y;
        cellRect.width = getWidth();

        TableCellRenderer cellRenderer = table.getTableHeader().getDefaultRenderer();

        for (int i=rowMin; i<=rowMax; i++) {
            cellRect.height = table.getRowHeight(i);

            rendererPane.paintComponent(g, 
                    cellRenderer.getTableCellRendererComponent(table, i, false, false, i, 0),
                    this, cellRect);

            cellRect.y += cellRect.height;
        }

        rendererPane.removeAll();
    }

    private void adjustPreferredSize() {
        setPreferredSize(new Dimension(40, table.getPreferredSize().height));
    }

    /* DATA */
    JTable table;
    CellRendererPane rendererPane;
}

PM MAIL   Вверх
Ccoder
Дата 25.3.2011, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Что-то он опять неработает у меня
я делаю
Код

    public MainFrame()
    {
        initComponents();
        setLocationRelativeTo(null);
        JTableRowHeader test = new JTableRowHeader(Table1);
    }

и ничего невижу.

В примере так неплохо, а может как-то повернуть ещё можно? Тоесть тут они выглядят так-же как и на верху

Это сообщение отредактировал(а) Ccoder - 25.3.2011, 04:17
PM MAIL   Вверх
pathfinder
Дата 25.3.2011, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что-бы JTableRowHeader отображался его необходимо добавить в JScrollPane.

Код

public MainFrame()
    {
        initComponents();
        setLocationRelativeTo(null);
        jScrollPane.setRowHeaderView(new JTableRowHeader(Table1));
    }

PM MAIL   Вверх
Ccoder
Дата 25.3.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А во как оказывается.
Теперь всё работает, ура!  smile 
Немного нето, но наверно если постараться, то можно сделать что-бы они поворачивались.
Главное сам принцип я уловил.
pathfinder, спасибо за код. (поставьте пожалуйста кто-нибудь + за меня)

Это сообщение отредактировал(а) Ccoder - 25.3.2011, 20:33
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1435 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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