Как правильно рассчитать высоту строки jTable, чтобы обеспечить полное отображение содержимого jLabel, содержащего HTML? - PullRequest
2 голосов
/ 13 августа 2010

У меня есть экземпляр JTable, содержащий количество строк.Столбцы в этой таблице - это экземпляры JLabel, содержащие строку в формате HTML.

Одно из моих требований заключается в том, что все данные в этих столбцах должны отображаться.Если ширина столбца (по какой-либо причине) недостаточно велика для отображения всех данных, текст следует перенести на следующую строку.В настоящее время текст просто обрезан.

Этот фрагмент кода иллюстрирует проблему:

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TableTest {

 public static void main(final String[] args) {

  final JTable jTable = new JTable();

  jTable.setModel(new DefaultTableModel() {
   private static final long serialVersionUID = 1L;
   @Override
   public Object getValueAt(final int row, final int column) {
    final StringBuffer sb = new StringBuffer();
    sb.append("<html>");
    sb.append("<font color=\"red\">this text is red</font> ");
    sb.append("<font color=\"green\">this text is green!</font>");
    sb.append("</html>");
    return sb.toString();
   }
   @Override
   public int getColumnCount() {
    return 2;
   }
   @Override
   public int getRowCount() {
    return 2;
   }
  });

  final JFrame jFrame = new JFrame();
  jFrame.getContentPane().add(jTable);
  jFrame.setSize(120, 80);
  jFrame.pack();
  jFrame.setTitle("Table test");
  jFrame.setLocationRelativeTo(null);
  jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  jFrame.setVisible(true);

 }

}

Моя проблема может стать более понятной при запуске SSCCE выше.Если размер JFrame изменяется, я хочу, чтобы высота строки автоматически изменялась, чтобы можно было отобразить все содержимое JPanel.

Из-за требования HTML я не могу использовать JTextArea.

Спасибо,

Бен

1 Ответ

5 голосов
/ 13 августа 2010

Это было хорошим испытанием для утра пятницы.

Ответ заключается в использовании пользовательского TableCellRenderer, который обновляет высоту таблицы на лету:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.*;

public class ScratchSpace {


    public static void main(final String[] args) {

        final JTable jTable = new JTable();

        jTable.setModel(new DefaultTableModel() {
            private static final long serialVersionUID = 1L;

            @Override
            public Object getValueAt(final int row, final int column) {
                final StringBuffer sb = new StringBuffer();
                sb.append("<html>");
                sb.append("<font color=\"red\">this text is red</font> ");
                sb.append("<font color=\"green\">this text is green!</font>");
                sb.append("</html>");
                return sb.toString();
            }

            @Override
            public int getColumnCount() {
                return 2;
            }

            @Override
            public int getRowCount() {
                return 2;
            }
        });


        jTable.getColumnModel().getColumn(0).setCellRenderer(new MyTableCellRenderer());
        jTable.getColumnModel().getColumn(1).setCellRenderer(new MyTableCellRenderer());
        final JFrame jFrame = new JFrame();
        jFrame.getContentPane().add(jTable);
        jFrame.setSize(120, 80);
        jFrame.pack();
        jFrame.setTitle("Table test");
        jFrame.setLocationRelativeTo(null);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setVisible(true);

    }

    private static class MyTableCellRenderer extends JLabel implements TableCellRenderer {

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            setText(String.valueOf(value));
            table.setRowHeight(row, getPreferredSize().height);
            return this;
        }
    }
}

Я думаю, что есть проблема с моим решением - последний столбец, который будет обновляться в каждой строке, в конечном итоге будет единственным, кто получит право голоса в высоте строки. Я оставляю решение этой проблемы в качестве упражнения для читателя. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...