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


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

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

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

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

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

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

Автор: dorogoyIV 1.2.2012, 09:08
если таблица лежит на JScrollPane, то у JScrollPane есть RowHeader

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

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

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


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

Автор: dorogoyIV 1.2.2012, 11:34
Код

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

Автор: Mirkes 1.2.2012, 12:50
Спасибо. Попробую сделать.

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

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