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


Автор: markivanov 22.11.2006, 11:15
Я использую AbstractTableModel. Мне нужно отображать данные слева на право. Как убрать название столбцов и поставить название строк?

Автор: LSD 22.11.2006, 11:37
Тебе надо работать с JScrollPane, setRowHeaderView() и setColumnHeaderView(). Пример можно посмотреть в SwingSet demo и состава JDK.

Автор: markivanov 22.11.2006, 12:09
спасибо

Автор: markivanov 22.11.2006, 15:57
Помогите разобраться. в результате выполнения этого кода у меня таблица в одном месте помещается, а заголовки в другом?
Код
table=new JTable(new CDRTableModel());                
JScrollPane stable=new JScrollPane(table);
JViewport viewport = new JViewport();
viewport.setView(table);
stable.setColumnHeaderView(viewport);
JList columnNames=new JList(Settings.CDRcolumns);
stable.setRowHeaderView(columnNames);        
stable.setPreferredSize(new Dimension(this.wWidth-15,this.wHeight-65));
panel=new JPanel();
panel.add(stable);

Автор: Goliath 22.11.2006, 20:22
RowHeaderRenderer.java
Код

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

class RowHeaderRenderer extends JLabel implements ListCellRenderer 
{
    RowHeaderRenderer(JTable table) 
    {
        JTableHeader header = table.getTableHeader();
        setOpaque(true);
        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
        setHorizontalAlignment(CENTER);
        setForeground(header.getForeground());
        setBackground(header.getBackground());
        setFont(header.getFont());
    }
  
    public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) 
    {
        setText((value == null) ? "" : value.toString());    
        return this;
    }
}


RowHeaderExample.java
Код

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

public class RowHeaderExample extends JFrame 
{
    JScrollPane scroll;
    public RowHeaderExample() 
    {
        super( "Row Header Example" );
        setSize( 300, 150 );
        
        ListModel lm = new AbstractListModel() 
        {
            String headers[] = {"a1", "b", "c", "d", "e", "f", "g", "h", "i"};
            public int getSize() 
            {return headers.length;}
            
            public Object getElementAt(int index) 
            {
                return headers[index];
            }
        };

        DefaultTableModel dm = new DefaultTableModel(lm.getSize(),10);
        JTable table = new JTable(dm);
    
        JList rowHeader = new JList(lm);    
        rowHeader.setFixedCellWidth(50);
    
        rowHeader.setCellRenderer(new RowHeaderRenderer(table));

        scroll = new JScrollPane(table);
        
        scroll.setRowHeaderView(rowHeader);
        getContentPane().add(scroll, BorderLayout.CENTER);
    }
    
    public JScrollPane getScroll()
    {
        return scroll;
    }

    public static void main(String[] args) 
    {
        RowHeaderExample frame = new RowHeaderExample();
        frame.addWindowListener( new WindowAdapter() 
                    {
                        public void windowClosing( WindowEvent e ) 
                        {
                            System.exit(0);
                        }
                    });
        frame.setVisible(true);
        frame.getScroll().setColumnHeaderView(null);
        
    }
}

Надеюсь, данный код тебе поможет

Автор: markivanov 23.11.2006, 17:54
Большое спасибо, работает, Супер. Не думал, что с такой пустяковой задачей так тяжко будет

Автор: Goliath 23.11.2006, 18:56
Цитата(markivanov @  23.11.2006,  17:54 Найти цитируемый пост)
Большое спасибо, работает, Супер. Не думал, что с такой пустяковой задачей так тяжко будет 

Это только в начел со временем наработаешь кодов и сделаешь свою универсальную таблицу. Просто Jtable учтены все стандартные задачи по работе, и самое главное дана возможность гибко настраивать и изменять при помощи.

Автор: Platon 6.6.2007, 17:17
Цитата(Goliath @  22.11.2006,  20:22 Найти цитируемый пост)
RowHeaderRenderer.java

К сожалению такой подход не проходит, по двум причинам:
1). При изменении размера ряда все поедет.
2). При установке спецефического L&F (к примеру LiquidLAF) Лейблы отличаются от заголовков колонок.

Автор: fixxer 6.6.2007, 17:39
Посмотрите здесь
http://www.crionics.com/products/opensource/faq/swing_ex/JTableExamples1.html

Добавлено через 5 минут
пардон, там тоже самое.

Автор: Platon 6.6.2007, 18:34
Честно сказать, меня этот вопрос тоже очень волнует. В Qt с этим было как-то просто, а в Java, что то неудобно. Надеялся в SwingSet2 найти ответ... Неа, тю-тю.

Автор: maxlab 6.6.2007, 20:31
Цитата(Platon @  6.6.2007,  18:34 Найти цитируемый пост)
В Qt с этим было как-то прост


Ага... попался  smile  Раз в Qt просто - попробуй Qt Jambi. Заодно и нам расскажешь как это использовать. 

Автор: Platon 7.6.2007, 07:53
Не знаю какая там заморочка с Jambi, но в обычном Qt4.2.0c 
Код

bool QAbstractItemModel::setHeaderData ( int section, Qt::Orientation orientation, const QVariant & value, int role = Qt::EditRole )


Qt::Orientation orientation делаешь Vertical и будет тебе добро smile
Но по мойму в Qt такая простота достигнута благодаря тому, что QTableView уже обладает встроенным QScrollPane, так что работать с ней проще.

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