우선, 나는 새로운 주제를 시작한 것이 문제가 아니길 바래요. Tbh 나는 이미 응답 한 것에 기초하여 질문하는 방법을 모른다. 그래서 나는 이것을 만들었다.Java7의 JEditorPane 라인 랩
나는 Java로 꽤 새로워서 내 문제는 다음과 같다. 나는 약간의 채팅 프로그램을 작성 중이며 HTMLEditorKit
과 함께 JEditorPane
을 사용하여 텍스트를 다양한 색상으로 표시하고 스마일을 표시하며 하이퍼 링크를 표시합니다.
내 문제는 일부 연구 후에 Java7로 인한 문제인지 알게되었는데, linewrap이 제대로 작동하지 않을 수 있습니다. 텍스트 줄 바꿈 및 문자열 중간에 줄 바꿈을 구성 요소의 너비를 초과합니다. 단어 줄 바꿈은 제대로 작동하지만 누군가가 꽤 긴 문자열을 입력하면 JEditorPane
이 확장되고 프레임에서 크기를 조정해야 화면에 모든 항목이 표시됩니다.
이 문제에 대한 몇 가지 수정 사항을 시도했지만 단어 감싸기가 더 이상 작동하지 않는 문자 감싸기 만 허용합니다. 그 옆에, 사용자가 Enter 키를 눌러 텍스트를 감쌀 수있게하고 싶습니다. 텍스트에 \ n을 추가하고 수정하면 더 이상 결과에 영향을 미치지 않으며 모든 것이 한 줄에 표시됩니다.
나는 해결책을 찾기 위해 수년간 웹을 보냈지만 지금은 항상 동일한 수정으로 보인 이후로는 아무것도 할 수 없다고 생각합니다. 너희들이 나를 도울 수 있기를.
내가 무엇을 가지고 : Windows를 사용하는 경우
- 라인은 공백으로 구분 된 긴 문자열의 경우 단어를 래핑
- 이 입력 라인을 포함
이 요약 의미 타격으로 인해 생성 된 줄 바꿈, 줄 바꿈도 수행됩니다.
- 매우 긴 문자열을 공백없이 입력하면 패널이 확장되어 필요합니다. 이 경우 지금처럼
- 워드 랩 동작 : 프레임을
- HTML 형식의 크기를 조정하는 것은 나에게 다른 색상뿐만 아니라, 하이퍼 링크 및 이모티콘
내가 필요로 무엇을 표시 할 수 있습니다 가능하면 긴 줄이 공백으로 구분되지 않은 경우에만 편지를 감쌀 수 있습니다. 입력 영역에 입력 또는 내가 서식 입력 패널에 - HTML을 사전 형식의 텍스트를 복사하면 이미 내가 무엇을 시도했다
무엇을 가지고있는 것처럼 타격에 의해
jtextpane doesn't wrap text하고 여기에 JTextPane is not wrapping text
은 스스로를 시도하는 일부 코드입니다. 왼쪽 하단에는 텍스트를 입력 할 수있는 입력 영역이 있습니다. Enter 키를 눌러 줄 바꿈을 추가 할 수도 있습니다. 버튼을 클릭하면 위의 영역에 텍스트가 표시됩니다.
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.TitledBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
@SuppressWarnings("serial")
public class LineWrapTest extends JFrame implements ActionListener, KeyListener {
private JButton btnSend;
private JTextArea textAreaIn;
private JEditorPane textAreaOut;
private HTMLEditorKit kit;
private HTMLDocument doc;
public LineWrapTest() {
this.setSize(600, 500);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setTitle("Linewrap Test");
}
/**
* Not important for problem
*/
public void paintScreen() {
this.setLayout(new BorderLayout());
this.add(this.getPanelOut(), BorderLayout.CENTER);
this.add(this.getPanelIn(), BorderLayout.SOUTH);
this.textAreaIn.requestFocusInWindow();
this.setVisible(true);
}
/**
* Not important for problem
*
* @return panelOut
*/
private JPanel getPanelOut() {
JPanel panelOut = new JPanel();
panelOut.setLayout(new BorderLayout());
this.textAreaOut = new JEditorPane();
this.textAreaOut.setEditable(false);
this.textAreaOut.setContentType("text/html");
this.kit = new HTMLEditorKit();
this.doc = new HTMLDocument();
StyleSheet styleSheet = this.kit.getStyleSheet();
this.kit.setStyleSheet(styleSheet);
this.textAreaOut.setEditorKit(this.kit);
this.textAreaOut.setDocument(this.doc);
TitledBorder border = BorderFactory.createTitledBorder("Output");
border.setTitleJustification(TitledBorder.CENTER);
panelOut.setBorder(border);
panelOut.add(this.textAreaOut);
return panelOut;
}
/**
* Not important for problem
*
* @return panelIn
*/
private JPanel getPanelIn() {
JPanel panelIn = new JPanel();
panelIn.setLayout(new BorderLayout());
this.textAreaIn = new JTextArea();
this.textAreaIn.setLineWrap(true);
this.textAreaIn.setWrapStyleWord(true);
TitledBorder border = BorderFactory.createTitledBorder("Input");
border.setTitleJustification(TitledBorder.CENTER);
panelIn.setBorder(border);
panelIn.add(this.getBtnSend(), BorderLayout.EAST);
panelIn.add(this.textAreaIn, BorderLayout.CENTER);
return panelIn;
}
/**
* Not important for problem
*
* @return btnSend
*/
private JButton getBtnSend() {
this.btnSend = new JButton("Send");
this.btnSend.addActionListener(this);
return this.btnSend;
}
private void append(String text) {
try {
this.kit.insertHTML(this.doc, this.doc.getLength(), text, 0, 0, null);
} catch (BadLocationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private String getHTMLText() {
String txtIn = this.textAreaIn.getText().trim().replaceAll(SEPARATOR, "<br/>");
StringBuffer htmlBuilder = new StringBuffer();
htmlBuilder.append("<HTML>");
htmlBuilder.append(txtIn);
htmlBuilder.append("</HTML>");
return htmlBuilder.toString();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == this.btnSend) {
this.append(this.getHTMLText());
this.textAreaIn.setText("");
this.textAreaIn.requestFocusInWindow();
}
}
public static void main(String[] args) {
LineWrapTest test = new LineWrapTest();
test.paintScreen();
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER)
if (!this.textAreaIn.getText().trim().isEmpty())
this.textAreaIn.setText(this.textAreaIn.getText() + SEPARATOR);
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
는 UPDATE :
http://java-sl.com/tip_java7_text_wrapping_bug_fix.html의 일부에 베이스는 어떻게 든 내 목표에 좀 더 가까이 단계로 그것을 알아 냈다. 나는 HTMLEditorKit에 대한 수정을 StlyedEditorKit Fix와 결합하려고 시도했다. 하지만 솔직히 말해서, 내가 실제로 거기에서 무엇을했는지 전혀 알지 못한다. (슬픈 것은 HTMLEditorKit을 대체 할 때 수동 줄 바꿈이 더 이상 작동하지 않는다는 것이다. 어쩌면 이것을 다음과 같이 사용할 수있다. 좀 더 나은 구현을위한 기반
내 예제에서 사용하려면 CustomEditorKit을 사용하여 프로젝트에서 새 클래스를 만들고 예제의 HTMLEditorKit을이 CustomEditorKit으로 바꿉니다. 이제 단어 및 문자 배치가 작동하는 것을 알 수 있습니다 그러나 자신의 줄 바꿈을 위해 Enter 키를 누르면이 변경 사항이 출력 패널에 더 이상 나타나지 않고 모든 내용이 한 줄로 표시됩니다. 또 다른 이상한 문제는 프레임의 크기를 조정하면 줄이 가끔씩 나타납니다 서로 낳는다.
import javax.swing.SizeRequirements;
import javax.swing.text.Element;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.InlineView;
import javax.swing.text.html.ParagraphView;
@SuppressWarnings("serial")
public class CustomEditorKit extends HTMLEditorKit {
@Override
public ViewFactory getViewFactory() {
return new HTMLFactory() {
@Override
public View create(Element e) {
View v = super.create(e);
if (v instanceof InlineView) {
return new InlineView(e) {
@Override
public int getBreakWeight(int axis, float pos, float len) {
return GoodBreakWeight;
}
@Override
public View breakView(int axis, int p0, float pos, float len) {
if (axis == View.X_AXIS) {
this.checkPainter();
this.removeUpdate(null, null, null);
}
return super.breakView(axis, p0, pos, len);
}
};
}
else if (v instanceof ParagraphView) {
return new ParagraphView(e) {
@Override
protected SizeRequirements calculateMinorAxisRequirements(int axis, SizeRequirements r) {
if (r == null) {
r = new SizeRequirements();
}
float pref = this.layoutPool.getPreferredSpan(axis);
float min = this.layoutPool.getMinimumSpan(axis);
// Don't include insets, Box.getXXXSpan will include them.
r.minimum = (int) min;
r.preferred = Math.max(r.minimum, (int) pref);
r.maximum = Integer.MAX_VALUE;
r.alignment = 0.5f;
return r;
}
};
}
return v;
}
};
}
}
위의 코드를 사용하면 다음과 같은 상황이 발생합니다. JTextArea가 완벽하게 래핑됩니다. 긴 문자열과 단어는 모두 다음 줄로 줄 바꿈됩니다. JEditorPane은 단어가 긴 문자열로 확장 될 때까지 단어를 래핑합니다. 그런 다음 단어를 감쌀 때 문장은 구성 요소를 확장 한 문자열보다 길어야합니다. 엔터를 치면 현재 유니버설 라인 구분 기호를 사용하여 맞춤 포장이 이루어지지 않습니다. 원하는 것 : JTextArea와 마찬가지로 공백을 추가하지 않고 긴 문자열에 대해 JEditorPane을 래핑하면 확장되지 않습니다. 또한 JEpane에서 맞춤 래핑을 입력하십시오. –