Java 无法打开setCaretPosition上引发的系统剪贴板异常
我的Swing应用程序中有JEditorPane(communicationView),有时需要将其滚动到底部。滚动是通过将插入符号位置设置为文档结尾来完成的Java 无法打开setCaretPosition上引发的系统剪贴板异常,java,swing,clipboard,jeditorpane,getcaretpos,Java,Swing,Clipboard,Jeditorpane,Getcaretpos,我的Swing应用程序中有JEditorPane(communicationView),有时需要将其滚动到底部。滚动是通过将插入符号位置设置为文档结尾来完成的 private void setCommunicationViewCaretPosition(){ communicationView.setCaretPosition(communicationView.getDocument().getLength()); } 这通常有效,但一段时间后会引发以下异常: E
private void setCommunicationViewCaretPosition(){
communicationView.setCaretPosition(communicationView.getDocument().getLength());
}
这通常有效,但一段时间后会引发以下异常:
Exception in thread "Thread-6" java.lang.IllegalStateException: cannot open system clipboard
at sun.awt.windows.WClipboard.openClipboard(Native Method)
at sun.awt.datatransfer.SunClipboard.getClipboardFormatsOpenClose(SunClipboard.java:332)
at sun.awt.datatransfer.SunClipboard.isDataFlavorAvailable(SunClipboard.java:192)
at org.jdesktop.application.TextActions.updateTextActions(TextActions.java:132)
at org.jdesktop.application.TextActions.access$400(TextActions.java:47)
at org.jdesktop.application.TextActions$TextComponentCaretListener.caretUpdate(TextActions.java:115)
at javax.swing.text.JTextComponent.fireCaretUpdate(JTextComponent.java:407)
at javax.swing.text.JTextComponent$MutableCaretEvent.fire(JTextComponent.java:4417)
at javax.swing.text.JTextComponent$MutableCaretEvent.stateChanged(JTextComponent.java:4439)
at javax.swing.text.DefaultCaret.fireStateChanged(DefaultCaret.java:802)
at javax.swing.text.DefaultCaret.changeCaretPosition(DefaultCaret.java:1277)
at javax.swing.text.DefaultCaret.handleSetDot(DefaultCaret.java:1173)
at javax.swing.text.DefaultCaret.setDot(DefaultCaret.java:1154)
at javax.swing.text.DefaultCaret.setDot(DefaultCaret.java:1051)
at javax.swing.text.JTextComponent.setCaretPosition(JTextComponent.java:1680)
at aau.application.ApplicationView.setCommunicationViewCaretPosition(ApplicationView.java:643)
我不明白为什么会发生这种情况,或者设置插入符号位置与系统剪贴板有什么关系
设置插入符号位置似乎是向下滚动视图的最佳方式,但任何其他方法都可以解决我的问题
有时我需要将它滚动到底部
为什么??你滚动是因为你刚刚添加了新文本,你想看到你刚刚添加的文本,还是你有一个“滚动到底”按钮
在第一种情况下,您可以查看建议。我通常使用JTextArea或JTextPane来显示文本。JEditorPane只用于HTML,所以我不确定这个建议是否有效
对于第二种情况,您可以使用垂直滚动条并将其值设置为滚动条最大值
有时我需要将它滚动到底部
为什么??你滚动是因为你刚刚添加了新文本,你想看到你刚刚添加的文本,还是你有一个“滚动到底”按钮
在第一种情况下,您可以查看建议。我通常使用JTextArea或JTextPane来显示文本。JEditorPane只用于HTML,所以我不确定这个建议是否有效
对于第二种情况,您可以使用垂直滚动条并将其值设置为滚动条最大值
有时我需要将它滚动到底部
为什么??你滚动是因为你刚刚添加了新文本,你想看到你刚刚添加的文本,还是你有一个“滚动到底”按钮
在第一种情况下,您可以查看建议。我通常使用JTextArea或JTextPane来显示文本。JEditorPane只用于HTML,所以我不确定这个建议是否有效
对于第二种情况,您可以使用垂直滚动条并将其值设置为滚动条最大值
有时我需要将它滚动到底部
为什么??你滚动是因为你刚刚添加了新文本,你想看到你刚刚添加的文本,还是你有一个“滚动到底”按钮
在第一种情况下,您可以查看建议。我通常使用JTextArea或JTextPane来显示文本。JEditorPane只用于HTML,所以我不确定这个建议是否有效
对于第二种情况,您只需使用垂直滚动条并将其值设置为滚动条最大值。要访问剪贴板: 使用此文本创建类文件
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.Toolkit;
import java.io.*;
public final class clipboardData implements ClipboardOwner {
public static void main(String... aArguments ){
clipboardData Clipboard = new clipboardData();
}
/**
* Empty implementation of the ClipboardOwner interface.
* @param aClipboard
* @param aContents
*/
@Override
public void lostOwnership(Clipboard aClipboard, Transferable aContents){
//do nothing
}
/**
* Place a String on the clipboard, and make this class the
* owner of the Clipboard's contents.
* @param aString
*/
public void setData(String aString){
StringSelection stringSelection = new StringSelection(aString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, this);
}
/**
* Get the String residing on the clipboard.
*
* @return any text found on the Clipboard; if none found, return an
* empty String.
*/
public String getData() {
String result = "";
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//odd: the Object param of getContents is not currently used
Transferable contents = clipboard.getContents(null);
boolean hasTransferableText =
(contents != null) &&
contents.isDataFlavorSupported(DataFlavor.stringFlavor);
if (hasTransferableText) {
try {
result = (String)contents.getTransferData(DataFlavor.stringFlavor);
}
catch (UnsupportedFlavorException | IOException ex){
System.out.println(ex);
ex.printStackTrace();
}
}
return result;
}
}
上述代码可通过以下功能访问:
创建新的剪贴板编辑器:
clipboardData clipboardData = new clipboardData();
设置数据功能:
clipboardData.setData(Data);
clipboardData.getData();
getData函数:
clipboardData.setData(Data);
clipboardData.getData();
要访问剪贴板,请执行以下操作: 使用此文本创建类文件
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.Toolkit;
import java.io.*;
public final class clipboardData implements ClipboardOwner {
public static void main(String... aArguments ){
clipboardData Clipboard = new clipboardData();
}
/**
* Empty implementation of the ClipboardOwner interface.
* @param aClipboard
* @param aContents
*/
@Override
public void lostOwnership(Clipboard aClipboard, Transferable aContents){
//do nothing
}
/**
* Place a String on the clipboard, and make this class the
* owner of the Clipboard's contents.
* @param aString
*/
public void setData(String aString){
StringSelection stringSelection = new StringSelection(aString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, this);
}
/**
* Get the String residing on the clipboard.
*
* @return any text found on the Clipboard; if none found, return an
* empty String.
*/
public String getData() {
String result = "";
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//odd: the Object param of getContents is not currently used
Transferable contents = clipboard.getContents(null);
boolean hasTransferableText =
(contents != null) &&
contents.isDataFlavorSupported(DataFlavor.stringFlavor);
if (hasTransferableText) {
try {
result = (String)contents.getTransferData(DataFlavor.stringFlavor);
}
catch (UnsupportedFlavorException | IOException ex){
System.out.println(ex);
ex.printStackTrace();
}
}
return result;
}
}
上述代码可通过以下功能访问:
创建新的剪贴板编辑器:
clipboardData clipboardData = new clipboardData();
设置数据功能:
clipboardData.setData(Data);
clipboardData.getData();
getData函数:
clipboardData.setData(Data);
clipboardData.getData();
要访问剪贴板,请执行以下操作: 使用此文本创建类文件
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.Toolkit;
import java.io.*;
public final class clipboardData implements ClipboardOwner {
public static void main(String... aArguments ){
clipboardData Clipboard = new clipboardData();
}
/**
* Empty implementation of the ClipboardOwner interface.
* @param aClipboard
* @param aContents
*/
@Override
public void lostOwnership(Clipboard aClipboard, Transferable aContents){
//do nothing
}
/**
* Place a String on the clipboard, and make this class the
* owner of the Clipboard's contents.
* @param aString
*/
public void setData(String aString){
StringSelection stringSelection = new StringSelection(aString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, this);
}
/**
* Get the String residing on the clipboard.
*
* @return any text found on the Clipboard; if none found, return an
* empty String.
*/
public String getData() {
String result = "";
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//odd: the Object param of getContents is not currently used
Transferable contents = clipboard.getContents(null);
boolean hasTransferableText =
(contents != null) &&
contents.isDataFlavorSupported(DataFlavor.stringFlavor);
if (hasTransferableText) {
try {
result = (String)contents.getTransferData(DataFlavor.stringFlavor);
}
catch (UnsupportedFlavorException | IOException ex){
System.out.println(ex);
ex.printStackTrace();
}
}
return result;
}
}
上述代码可通过以下功能访问:
创建新的剪贴板编辑器:
clipboardData clipboardData = new clipboardData();
设置数据功能:
clipboardData.setData(Data);
clipboardData.getData();
getData函数:
clipboardData.setData(Data);
clipboardData.getData();
要访问剪贴板,请执行以下操作: 使用此文本创建类文件
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.Toolkit;
import java.io.*;
public final class clipboardData implements ClipboardOwner {
public static void main(String... aArguments ){
clipboardData Clipboard = new clipboardData();
}
/**
* Empty implementation of the ClipboardOwner interface.
* @param aClipboard
* @param aContents
*/
@Override
public void lostOwnership(Clipboard aClipboard, Transferable aContents){
//do nothing
}
/**
* Place a String on the clipboard, and make this class the
* owner of the Clipboard's contents.
* @param aString
*/
public void setData(String aString){
StringSelection stringSelection = new StringSelection(aString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, this);
}
/**
* Get the String residing on the clipboard.
*
* @return any text found on the Clipboard; if none found, return an
* empty String.
*/
public String getData() {
String result = "";
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//odd: the Object param of getContents is not currently used
Transferable contents = clipboard.getContents(null);
boolean hasTransferableText =
(contents != null) &&
contents.isDataFlavorSupported(DataFlavor.stringFlavor);
if (hasTransferableText) {
try {
result = (String)contents.getTransferData(DataFlavor.stringFlavor);
}
catch (UnsupportedFlavorException | IOException ex){
System.out.println(ex);
ex.printStackTrace();
}
}
return result;
}
}
上述代码可通过以下功能访问:
创建新的剪贴板编辑器:
clipboardData clipboardData = new clipboardData();
设置数据功能:
clipboardData.setData(Data);
clipboardData.getData();
getData函数:
clipboardData.setData(Data);
clipboardData.getData();
你可以试着用你可以试着用你可以试着用你可以试着用