JTextArea를 TableCellRenderer로 사용하는 JTable을 사용하므로 표 셀에서 단어 줄 바꿈을 사용할 수 있습니다. JTable이 잘 표시됩니다. JTable의 print method을 통해 테이블을 프린터로 인쇄 할 때 출력은 항상 데이터의 약 60 %에서 잘립니다. 다른 컴퓨터와 다른 프린터, 다른 프린터 드라이버, 다른 JVM 버전 (1.5, 1.6)을 시도했지만 그 중 아무 것도 도움이되지 않았습니다. 다음은이 문제를 재현하는 자체 포함 된 Java 기본 클래스입니다. 어떤 아이디어?잘라진 JTable 인쇄 출력
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class JTextAreaJTableTest extends javax.swing.JFrame {
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
JTextAreaJTableTest frame = new JTextAreaJTableTest();
frame.setSize(640, 480);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
JButton jButtonPrint;
JScrollPane jScrollPane;
JTable jTable;
JToolBar jToolBar;
public JTextAreaJTableTest() {
initComponents();
DefaultTableModel dtm = (DefaultTableModel) jTable.getModel();
Vector<Vector<String>> data = new Vector<Vector<String>>();
for (int i = 0; i < 50; i++) {
Vector<String> rowData = new Vector<String>();
rowData.add("Entry " + i);
rowData.add("Lorem ipsum dolor sit amet, consectetur adipisicing"
+ " elit, sed do eiusmod tempor incididunt ut labore et"
+ " dolore magna aliqua. Ut enim ad minim veniam, quis"
+ " nostrud exercitation ullamco laboris nisi ut aliquip"
+ " ex ea commodo consequat. Duis aute irure dolor in"
+ " reprehenderit in voluptate velit esse cillum dolore"
+ " eu fugiat nulla pariatur. Excepteur sint occaecat"
+ " cupidatat non proident, sunt in culpa qui officia"
+ " deserunt mollit anim id est laborum. " + i);
data.add(rowData);
}
Vector<String> columnNames = new Vector<String>();
columnNames.add("Key");
columnNames.add("Value");
dtm.setDataVector(data, columnNames);
jTable.setDefaultRenderer(String.class, null);
jTable.getColumnModel().getColumn(0).setCellRenderer(
new TextAreaCellRenderer());
jTable.getColumnModel().getColumn(1).setCellRenderer(
new TextAreaCellRenderer());
}
private void initComponents() {
jToolBar = new JToolBar();
jButtonPrint = new JButton();
jScrollPane = new JScrollPane();
jTable = new JTable();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jToolBar.setRollover(true);
jButtonPrint.setText("Print");
jButtonPrint.setFocusable(false);
jButtonPrint.setHorizontalTextPosition(SwingConstants.CENTER);
jButtonPrint.setVerticalTextPosition(SwingConstants.BOTTOM);
jButtonPrint.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
jButtonPrintActionPerformed(evt);
}
});
jToolBar.add(jButtonPrint);
getContentPane().add(jToolBar, BorderLayout.NORTH);
jScrollPane.setViewportView(jTable);
getContentPane().add(jScrollPane, BorderLayout.CENTER);
}
private void jButtonPrintActionPerformed(ActionEvent evt)
{
try {
jTable.print();
} catch (PrinterException ex) {
ex.printStackTrace();
}
}
public static class TextAreaCellRenderer extends JTextArea implements
TableCellRenderer {
public TextAreaCellRenderer() {
this.setLineWrap(true);
this.setWrapStyleWord(true);
}
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
this.setText(String.valueOf(value));
TableColumnModel columnModel = table.getColumnModel();
this.setSize(columnModel.getColumn(column).getWidth(), 1);
int newHeight = this.getPreferredSize().height;
if (newHeight > table.getRowHeight(row)) {
table.setRowHeight(row, this.getPreferredSize().height);
}
return this;
}
}
}
잘못된 방법 : 어떤 방법으로 발신자의 상태를 절대 변경하지 not_ _must 렌더링을 – kleopatra
@kleopatra - 의견에 감사드립니다. 귀하의 의견에 응답하여 내 대답을 업데이트하고 싶습니다. 그러나 규칙의 문서화를 찾으러 갔는데 "렌더러가 호출자의 상태를 변경해서는 안됩니다."그리고 아무 것도 찾을 수 없었습니다. 나는 당신이 틀렸다고 말하는 것이 아닙니다. 단지 그것에 대해 더 읽고 확증을 얻고 싶습니다. 이 계약서의 문서화 된 부분에 대한 아이디어가 있습니까? –