1132 На самом деле ответ Ма Хереса очень важен. также этот ответ относится к аналогичному вопросу : этот вопрос включает в себя несколько вещей:
=
порядок присваивания: идет справа налево; example1:
;(function Anonymous(){
var a = b = {};
console.log(a==b); //true
})();
a
был поднят в область выполнения Anonymous
. [ +1134] [одна тысяча сто двадцать семь]
b
будет назначен как {}
, но поскольку b
не определено, b
назначается глобальному контексту window
, тогда window.b
назначается {}
; затем window.b = {}
return
с {}
.
локальной переменной a
присваивается значение {}.
Следовательно, здесь происходит несколько интересных вещей: local variable a
и global variable b
оба указывают на один и тот же объект {}
, поэтому они являются ==
и ===
; помните, что {}=={}
дает false
иное.
Примечание: если в строгом режиме:
;(function Anonymous(){
'use strict'
var a = b = {}; //Uncaught ReferenceError: b is not defined
})();
это последовательное назначение не будет работать так же ...
Проблема в том, что высота строк в JTable фиксирована, поэтому дело не только в рендерере, который оборачивает; Я не уверен, почему это не так, но если бы это было так, обернутый текст был бы обрезан - или, может быть, это именно то, что вы видите. Чтобы отрегулировать высоту ряда, необходимо установить их индивидуально.
Вы можете использовать JLabel в качестве средства визуализации, вставить текст в тег HTML и просто добавить
, где это необходимо
Привет, у меня была такая же проблема, но реализованное мной решение основано на образце, доступном в Руководстве по 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);
}
}
};