Динамически изменять высоту ячейки в JTable с помощью GridBagLayout - PullRequest
3 голосов
/ 05 мая 2011

Я столкнулся с проблемой, когда у меня есть JTable, размеченный с помощью менеджера GridBagLayout, и число строк в таблице не фиксировано.Я намерен заполнить пространство, назначенное таблице, всеми ее ячейками, однако между последней строкой таблицы и следующим компонентом в контейнере имеется большое пустое (и белое) пространство.

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

Любые предложения приветствуются, и, если есть лучший способ добиться желаемого эффекта, пожалуйста, просветите меня.Спасибо.

PS Я использую JTable внутри JPanel вместо JScrollPane, если это имеет какое-либо значение.

Редактировать: Итак, я попробовал следующий код, который, безусловно, регулирует высотустрок в зависимости от количества имеющихся строк, но после последней строки и перед следующим компонентом все еще остается пустой пробел.Хотите знать, почему?

// re-size the header and row height to fill the whole tPanel
int panelHeight = tPanel.getHeight();
int desiredRowHeight = panelHeight / (numOfRows + 1);
friendsInfo.getTableHeader().setPreferredSize(new Dimension(table.getColumnModel().getTotalColumnWidth(), desiredRowHeight));
table.setRowHeight(desiredRowHeight);

1 Ответ

2 голосов
/ 05 мая 2011

Да, вы можете. Просто установите высоту строки. Вы должны использовать что-то вроде здесь . Очевидно, я предполагаю, что ваша панель имеет «постоянный» размер. В противном случае макет будет изменять его размер до соответствующего размера, то есть размера таблицы.

Если да, то вы можете использовать высоту панели для расчета высоты, которую должен занимать каждый ряд.

EDIT1: Ниже приведен пример, показывающий, как это можно сделать, используя GridBagLayout. Я сделал все, чтобы он выглядел как можно лучше, хотя все же у него странное поведение (на короткое время он приобретает минимальный размер), когда вы уменьшаете размер кадра. Но с другой стороны, это может быть поведение по умолчанию для макета, о котором я не знаю.

ПРИМЕЧАНИЕ: Я не являюсь экспертом в использовании этого менеджера компоновки (лично я его ненавижу). Таким образом, если есть некоторые параметры, которые следует / не следует устанавливать, пожалуйста, дайте мне знать (и не стесняйтесь редактировать ответ).

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.JTableHeader;

public class TableRowResizeTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {   
                final JTable table = new JTable(3,3);
                final JTableHeader tHeader = table.getTableHeader();
                final JPanel tPanel = new JPanel(new GridBagLayout());
                tPanel.setBackground(Color.CYAN);
                ComponentListener cL = new ComponentAdapter() 
                {
                    @Override
                    public void componentResized(ComponentEvent e)
                    {
                        super.componentResized(e);
                        // re-size the header and row height to fill the whole tPanel
                        int panelHeight = tPanel.getHeight();
                        int numOfRows = table.getRowCount();
                        int desiredRowHeight = panelHeight / (numOfRows + 1);
                        int gap = panelHeight - desiredRowHeight * (numOfRows + 1);
                        tHeader.setPreferredSize(new Dimension(tHeader.getPreferredSize().width, 
                                desiredRowHeight+gap));
                        tHeader.revalidate();
                        tHeader.repaint();
                        if(desiredRowHeight <1)
                            desiredRowHeight = 1;
                        table.setRowHeight(desiredRowHeight);
                        table.revalidate();
                        table.repaint();
                        System.out.println("tPanel componentResized p.h="+tPanel.getHeight()
                            +"; desiredRowHeight="+desiredRowHeight+"; gap="+gap);
                    }                   
                };
                tPanel.addComponentListener(cL);
                GridBagConstraints c = new GridBagConstraints();
                c.fill = GridBagConstraints.VERTICAL;
                c.gridx = 0;
                c.gridy = 0;
                c.weighty = 1.0;
                tPanel.add(tHeader, c);
                c.gridy = 1;
                c.weighty = 0.0;
                tPanel.add(table,c);
                JPanel contentPane = new JPanel(new BorderLayout());
                contentPane.setBackground(Color.RED);
                contentPane.add(tPanel);
                JFrame f = new JFrame();
                f.setContentPane(contentPane);
                f.setSize(800, 600);
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                System.out.println("before f.setVisible p.h="+tPanel.getHeight());
                f.setVisible(true); 
                System.out.println("after f.setVisible p.h="+tPanel.getHeight());
            }
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...