Как перенести строки в jtable ячейку?

1132 На самом деле ответ Ма Хереса очень важен. также этот ответ относится к аналогичному вопросу : этот вопрос включает в себя несколько вещей:

  1. hoist: переменные поднимаются до выполнения блочного кода;
  2. = порядок присваивания: идет справа налево;
  3. глобальный контекст: в нестрогом режиме, когда переменная не определена, она переходит в глобальный контекст; но выбрасывает в режиме «использовать строгий»;

example1:

;(function Anonymous(){
  var a = b = {};
  console.log(a==b); //true
})();
  1. a был поднят в область выполнения Anonymous. [ +1134] [одна тысяча сто двадцать семь]

  2. b будет назначен как {}, но поскольку b не определено, b назначается глобальному контексту window, тогда window.b назначается {} ; затем window.b = {} return с {}.

  3. локальной переменной a присваивается значение {}.

Следовательно, здесь происходит несколько интересных вещей: local variable a и global variable b оба указывают на один и тот же объект {}, поэтому они являются == и ===; помните, что {}=={} дает false иное.

Примечание: если в строгом режиме:

;(function Anonymous(){
  'use strict'
  var a = b = {}; //Uncaught ReferenceError: b is not defined
})();

это последовательное назначение не будет работать так же ...

31
задан Florent Bayle 2 July 2014 в 06:39
поделиться

3 ответа

Проблема в том, что высота строк в JTable фиксирована, поэтому дело не только в рендерере, который оборачивает; Я не уверен, почему это не так, но если бы это было так, обернутый текст был бы обрезан - или, может быть, это именно то, что вы видите. Чтобы отрегулировать высоту ряда, необходимо установить их индивидуально.

11
ответ дан 27 November 2019 в 22:49
поделиться

Вы можете использовать JLabel в качестве средства визуализации, вставить текст в тег HTML и просто добавить
, где это необходимо

Как использовать HTML в Swing Components

2
ответ дан 27 November 2019 в 22:49
поделиться

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

http://java.sun.com/docs/books/tutorial/2d/text/drawmulstring.html

import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextLayout;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import java.text.BreakIterator;

import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;


public class MultilineTableCell 
    implements TableCellRenderer {
    class CellArea extends DefaultTableCellRenderer {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private String text;
        protected int rowIndex;
        protected int columnIndex;
        protected JTable table;
        protected Font font;
        private int paragraphStart,paragraphEnd;
        private LineBreakMeasurer lineMeasurer;

        public CellArea(String s, JTable tab, int row, int column,boolean isSelected) {
            text = s;
            rowIndex = row;
            columnIndex = column;
            table = tab;
            font = table.getFont();
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                setBackground(table.getSelectionBackground());
            }
        }
        public void paintComponent(Graphics gr) {
            super.paintComponent(gr);
            if ( text != null && !text.isEmpty() ) {
                Graphics2D g = (Graphics2D) gr;
                if (lineMeasurer == null) {
                    AttributedCharacterIterator paragraph = new AttributedString(text).getIterator();
                    paragraphStart = paragraph.getBeginIndex();
                    paragraphEnd = paragraph.getEndIndex();
                    FontRenderContext frc = g.getFontRenderContext();
                    lineMeasurer = new LineBreakMeasurer(paragraph,BreakIterator.getWordInstance(), frc);
                }
                float breakWidth = (float)table.getColumnModel().getColumn(columnIndex).getWidth();
                float drawPosY = 0;
                // Set position to the index of the first character in the paragraph.
                lineMeasurer.setPosition(paragraphStart);
                // Get lines until the entire paragraph has been displayed.
                while (lineMeasurer.getPosition() < paragraphEnd) {
                    // Retrieve next layout. A cleverer program would also cache
                    // these layouts until the component is re-sized.
                    TextLayout layout = lineMeasurer.nextLayout(breakWidth);
                    // Compute pen x position. If the paragraph is right-to-left we
                    // will align the TextLayouts to the right edge of the panel.
                    // Note: this won't occur for the English text in this sample.
                    // Note: drawPosX is always where the LEFT of the text is placed.
                    float drawPosX = layout.isLeftToRight()
                        ? 0 : breakWidth - layout.getAdvance();
                    // Move y-coordinate by the ascent of the layout.
                    drawPosY += layout.getAscent();
                    // Draw the TextLayout at (drawPosX, drawPosY).
                    layout.draw(g, drawPosX, drawPosY);
                    // Move y-coordinate in preparation for next layout.
                    drawPosY += layout.getDescent() + layout.getLeading();
                }
                table.setRowHeight(rowIndex,(int) drawPosY);
            }
        }
    }
    public Component getTableCellRendererComponent(
            JTable table, Object value,boolean isSelected, boolean hasFocus, int row,int column
        )
    {
        CellArea area = new CellArea(value.toString(),table,row,column,isSelected);
        return area;
    }   
}

Он также изменяет размер строки, но делает это хорошо только тогда, когда это средство визуализации используется для одного столбца.

Именно так я использовал его для рендеринга моей таблицы.

final int wordWrapColumnIndex = ...;
myTable = new JTable() {    
    public TableCellRenderer getCellRenderer(int row, int column) {
        if (column == wordWrapColumnIndex ) {
            return wordWrapRenderer;
        }
        else {
            return super.getCellRenderer(row, column);
        }
    }
};
6
ответ дан 27 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: