Как отобразить несколько строк в ячейке JTable - PullRequest
5 голосов
/ 31 марта 2012

Я хотел бы создать JTable, как показано ниже: enter image description here

Какой класс java будет использоваться и, возможно, как?

Ответы [ 7 ]

12 голосов
/ 26 сентября 2015

Многострочный JTable ячейка может сделать с помощью настроенного TableCellRenderer легко. Используйте следующие шаги для создания TableCellRenderer.

Шаг 1: Создать TableCellRenderer

Следующий код показывает создание многострочного TableCellRenderer для String[] значений. Можно изменить String[] на Vector или другой Collection тип

public class MultiLineTableCellRenderer extends JList<String> implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        //make multi line where the cell value is String[]
        if (value instanceof String[]) {
            setListData((String[]) value);
        }

        //cell backgroud color when selected
        if (isSelected) {
            setBackground(UIManager.getColor("Table.selectionBackground"));
        } else {
            setBackground(UIManager.getColor("Table.background"));
        }

        return this;
    }
}

Шаг 2: Установите TableCellRenderer в JTable

    MultiLineTableCellRenderer renderer = new MultiLineTableCellRenderer();

    //set TableCellRenderer into a specified JTable column class
    table.setDefaultRenderer(String[].class, renderer);

    //or, set TableCellRenderer into a specified JTable column
    table.getColumnModel().getColumn(columnIndex).setCellRenderer(renderer);

Это мой проверенный скриншот:

Multi-line TableCellRenderer Test

5 голосов
/ 31 марта 2012

в принципе вы можете поместить любой тип JComponents в ячейку JTable, в зависимости от того, является ли содержимое редактируемым, о чем говорит мне следующее

  • JTable с одним TableColumn без TableHeader

  • JPanel (GridBagLayout) с JLabels или JTextFields

  • JList

1 голос
/ 08 мая 2018

Это не будет работать, если вы используете DefaultTableModel. Вы должны использовать пользовательскую модель для вашей таблицы, которая расширяет AbstractTableModel и должны переопределить метод getColumnClass() вместе с другими абстрактными методами.

Вы также установите высоту строки таблицы , как указано в комментарии выше .

В официальной документации от Oracle это уточняется.

0 голосов
/ 10 января 2019

Помимо TableCellRenderer на основе JList<String>, как предлагает Чанна Джаямуни, вы также можете построить многострочное средство рендеринга поверх DefaultTableCellRenderer.Хитрость заключается в том, чтобы использовать функцию HTML компонента JLabel и соответственно отрегулировать высоту строки.Это сохраняет больше возможностей рендерера по умолчанию.

Активация этого рендерера для всех строк в большинстве случаев будет делать то, что вы хотите:

setDefaultRenderer(String.class, new MultiLineCellRenderer());

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

/** Variant of DefaultTableCellRenderer that automatically switches
 *  to multi-line HTML when the value contains newlines. */
class MultiLineCellRenderer extends DefaultTableCellRenderer
{
  @Override public Component getTableCellRendererComponent(JTable table,
    Object value, boolean isSelected, boolean hasFocus, int row, int column)
  { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    int height = c.getPreferredSize().height;
    if (table.getRowHeight(row) < height)
      table.setRowHeight(row, height);
    return c;
  }

  @Override protected void setValue(Object value)
  { if (value instanceof String)
    { String sVal = (String)value;
      if (sVal.indexOf('\n') >= 0 && // any newline?
        !(sVal.startsWith("<html>") && sVal.endsWith("</html>"))) // already HTML?
        value = "<html><nobr>" + htmlEncodeLines(sVal) + "</nobr></html>";
    }
    super.setValue(value);
  }

  /** Encode string as HTML. Convert newlines to &lt;br&gt; as well.
   * @param s String to encode.
   * @return Encoded string. */
  protected static String htmlEncodeLines(String s)
  { int i = indexOfAny(s, "<>&\n", 0); // find first char to encode
    if (i < 0)
      return s; // none
    StringBuffer sb = new StringBuffer(s.length() + 20);
    int j = 0;
    do
    { sb.append(s, j, i).append(htmlEncode(s.charAt(i)));
      i = indexOfAny(s, "<>&\n", j = i + 1);
    } while (i >= 0);
    sb.append(s, j, s.length());
    return sb.toString();
  }

  private static String htmlEncode(char c)
  { switch (c) {
    case '<': return "&lt;";
    case '>': return "&gt;";
    case '&': return "&amp;";
    case '\n': return "<br>";
    default: return Character.toString(c);
  } }

  private static int indexOfAny(String s, String set, int start)
  { for (int i = start; i < s.length(); ++i)
    if (set.indexOf(s.charAt(i)) >= 0)
      return i;
    return -1;
  }
}
0 голосов
/ 14 марта 2018
jTable1.setShowHorizontalLines(true); // only HorizontalLines
  jTable1.setShowVerticalLines(true); //  only VerticalLines
  jTable1.setShowGrid(true);          // show Horizontal and Vertical
  jTable1.setGridColor(Color.yellow); // change line color 
0 голосов
/ 12 марта 2018
jTable1.setShowGrid(true);

Попробуйте этот код:)

0 голосов
/ 31 марта 2012

Когда любая таблица имеет большой объем данных, в JTable применяется полоса прокрутки.JScrollPane предоставляет вам возможность прокрутки, чтобы прокрутить полосу прокрутки, и вы получите все содержимое.Простой пример использования JTable:

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

public class ScrollableJTable{
public static void main(String[] args) {
new ScrollableJTable();
}
public ScrollableJTable(){
JFrame frame = new JFrame("Creating a Scrollable JTable!");
JPanel panel = new JPanel();
 String data[][] =
  {{"001","abc","xyz","wtwt","gwgw","tttr","rtrt"},
  {"002","rwtr","ttrt","rtttr","trt","rtrt","trtrd"},
  {"003","rtt","trt","trt","trrttr","trt","rtr"},
  {"004","trt","trtt","trtrt","rtrtt","trt","trrt"},
  {"001","rttr","trt","trt","trtr","trt","trttr"},
  ;
  JTable table = new JTable(data,col);
  JTableHeader header = table.getTableHeader();
  header.setBackground(Color.yellow);
  JScrollPane pane = new JScrollPane(table);
  table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  panel.add(pane);
  frame.add(panel);
  frame.setSize(500,150);
  frame.setUndecorated(true);
  frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
  }
}

Теперь вы можете изменить эту таблицу в соответствии с вашими требованиями

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