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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не двигать первый столбец при скроле в JTable, Как сделать? 
:(
    Опции темы
Mirkes
Дата 1.2.2012, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть JTable с вертикальной и горизонтальной прокруткой. Как реализовать горизонтальную прокрутку так, что бы первый столбец оставался всегда на экране?


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


Эксперт
***


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

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



Самый простой способ: сделать две таблицы, которые будут выглядеть как одна. Например так:
Код

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class FixedColumnExample extends JFrame {
    Object[][] data;

    Object[] column;

    JTable fixedTable, table;

    public FixedColumnExample() {
        super("Fixed Column Example");
        setSize(400, 150);

        data = new Object[][]{{"1", "11", "A", "", "", "", "", ""},
                {"2", "22", "", "B", "", "", "", ""},
                {"3", "33", "", "", "C", "", "", ""},
                {"4", "44", "", "", "", "D", "", ""},
                {"5", "55", "", "", "", "", "E", ""},
                {"6", "66", "", "", "", "", "", "F"}};
        column = new Object[]{"fixed 1", "fixed 2", "a", "b", "c", "d", "e",
                "f"};

        AbstractTableModel fixedModel = new AbstractTableModel() {
            public int getColumnCount() {
                return 2;
            }

            public int getRowCount() {
                return data.length;
            }

            public String getColumnName(int col) {
                return (String) column[col];
            }

            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
        };
        AbstractTableModel model = new AbstractTableModel() {
            public int getColumnCount() {
                return column.length - 2;
            }

            public int getRowCount() {
                return data.length;
            }

            public String getColumnName(int col) {
                return (String) column[col + 2];
            }

            public Object getValueAt(int row, int col) {
                return data[row][col + 2];
            }

            public void setValueAt(Object obj, int row, int col) {
                data[row][col + 2] = obj;
            }

            public boolean CellEditable(int row, int col) {
                return true;
            }
        };

        fixedTable = new JTable(fixedModel) {
            public void valueChanged(ListSelectionEvent e) {
                super.valueChanged(e);
                checkSelection(true);
            }
        };
        table = new JTable(model) {
            public void valueChanged(ListSelectionEvent e) {
                super.valueChanged(e);
                checkSelection(false);
            }
        };
        fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        JScrollPane scroll = new JScrollPane(table);
        JViewport viewport = new JViewport();
        viewport.setView(fixedTable);
        viewport.setPreferredSize(fixedTable.getPreferredSize());
        scroll.setRowHeaderView(viewport);
        scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable
                .getTableHeader());

        getContentPane().add(scroll, BorderLayout.CENTER);
    }

    private void checkSelection(boolean isFixedTable) {
        int fixedSelectedIndex = fixedTable.getSelectedRow();
        int selectedIndex = table.getSelectedRow();
        if (fixedSelectedIndex != selectedIndex) {
            if (isFixedTable) {
                table.setRowSelectionInterval(fixedSelectedIndex,
                        fixedSelectedIndex);
            } else {
                fixedTable
                        .setRowSelectionInterval(selectedIndex, selectedIndex);
            }
        }
    }

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



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


Опытный
**


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

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



Спасибо за идею. А что, JTable  такой возможности совсем не предусматривает?


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


Эксперт
***


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

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



Из коробки - нет. Можно еще посмотреть в сторону JXTable из стороннего набора компонент SwingX, там возможностей побольше.


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


Опытный
**


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

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



А первый столбец - это таблица или наименования строк?
PM MAIL WWW   Вверх
dorogoyIV
Дата 1.2.2012, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



если таблица лежит на JScrollPane, то у JScrollPane есть RowHeader
PM MAIL   Вверх
Mirkes
Дата 1.2.2012, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dorogoyIV @  1.2.2012,  09:08 Найти цитируемый пост)
если таблица лежит на JScrollPane, то у JScrollPane есть RowHeader 

Да в ней. Честно говоря не понял, как rowHeader воспользоваться. В примерах в документации только вставка линейки :(
Если есть наработки или знаете где почитать, подскажите пожалуйста.

Цитата(Connie @  1.2.2012,  08:51 Найти цитируемый пост)
А первый столбец - это таблица или наименования строк? 


Можно считать названиями строк.

Это сообщение отредактировал(а) Mirkes - 1.2.2012, 11:10


--------------------
Mirkes
PM MAIL   Вверх
dorogoyIV
Дата 1.2.2012, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

public class Main extends JFrame
{
 JTable table = new JTable(10, 10);

 public Main()
 {
  add(new JScrollPane(table));
  table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  showRowHeader();
 }

 private void showRowHeader()
 {
  JScrollPane jsp = (JScrollPane)table.getParent().getParent();
  JViewport port = new JViewport();
  JPanel panel = new JPanel();
  panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

  for(int i = 0; i < table.getRowCount(); i++)
   panel.add(new JLabel(i + ""));

  port.setView(panel);
  jsp.setRowHeader(port);
 }

PM MAIL   Вверх
Mirkes
Дата 1.2.2012, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо. Попробую сделать.


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


Опытный
**


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

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



Цитата(jk1 @  1.2.2012,  08:03 Найти цитируемый пост)
Цитата(dorogoyIV @  1.2.2012,  11:34 Найти цитируемый пост)
 Спасибо большое за Ваше внимание и варианты решения моей проблемы. К сожелению они на этом не кончились - я воспользовался встроенным сортировщиком и в результате заголовки  остались несортированными smile. я глянул текст сортировщика и понял, что синхронизация сортировки таблиц дело уже не 5 минут, так что просить сделать за меня - не правильно. Хотя такой класс в виноградной библиотеке был бы не плох. Еще раз спасибо.



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

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

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


 




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


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

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