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


Автор: Ccoder 15.2.2011, 21:46
Использую NetBeans.
Мне нужно как-то реализовать следующий компонент.
Вот так он должен выглядеть
user posted image
Хочу так отображать память (по три байта). При этом во время выполнения программы память меняется.
Полностью незнаю с чего начать.
Подскажите пожалуйста, как тут что.

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

Автор: Ccoder 16.2.2011, 00:29
Уже начал использовать. Мнебы только ещё по бокам числа сделать. Ну в принце если очень сложното обойдусь, пардон.

Автор: techmax 16.2.2011, 04:44
создание заголовка для строк: 
http://www.java2s.com/Code/Java/Swing-Components/TableRowHeaderExample.htm

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

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

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

Автор: Ccoder 19.3.2011, 18:22
Слушайте, подскажите пожалуйста ктонибудь

Я просмотрел код приведённый выше, этот http://www.java2s.com/Code/Java/Swing-Components/TableRowHeaderExample.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, 22:13
Ну вот я нашел ещё в другом месте это дело http://lib.juga.ru/article/view/210/
только вот проблема в том что я не хочу делать наследование JTable, так как я кладу сам компонент с визуальным редактором.
Можно-ли как-то обойти это дело? И подойти по другому?

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

Код

   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

Автор: jk1 21.3.2011, 09:18
Цитата

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


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

Автор: Ccoder 22.3.2011, 21:36
Слушайте мне всё-таки очень интересно узнать, как сделать что-бы сбоку эта панель была похожа на 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 никак повернуть мне не удалось.

Автор: esivres 23.3.2011, 12:52
Его и не получится перевернуть, он так не умеет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 ричные данные то лучше реализовать свой собственный компонент от начала и до конца, это принесет на много больше пользы чем попытки прикрутить к таблице не свойственный ей функционал.

Автор: pathfinder 23.3.2011, 20:36
Код

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;

}



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

Автор: pathfinder 24.3.2011, 09:40
http://narod.ru/disk/8281123001/TableRowHeader.jar.html

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

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

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

Автор: pathfinder 24.3.2011, 16:59
http://narod.ru/disk/8316174001/TableRowHeader.jar.html

Код

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;
}

Автор: Ccoder 25.3.2011, 03:52
Что-то он опять неработает у меня
я делаю
Код

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

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

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

Автор: pathfinder 25.3.2011, 07:40
Что-бы JTableRowHeader отображался его необходимо добавить в JScrollPane.

Код

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

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

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