0

我的 Swing 应用程序中有 JEditorPane (communicationView),有时我需要将它滚动到底部。通过将插入符号位置设置为文档末尾来完成滚动。

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)

我无法弄清楚为什么会发生这种情况,或者设置插入符号位置与系统剪贴板有什么关系。

设置插入符号位置似乎是向下滚动视图的最佳方式,但任何其他方法都可以解决我的问题。

4

2 回答 2

2

要访问剪贴板:

使用此文本创建一个类文件

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();
于 2013-12-08T12:53:55.503 回答
1

有时我需要将其滚动到底部。

为什么?您滚动是因为您刚刚添加了新文本并且您想查看刚刚添加的文本,还是您有一个“滚动到底部”按钮。

在第一种情况下,您可以查看文本区域滚动以获取建议。我通常使用 JTextArea 或 JTextPane 来显示文本。JEdi​​torPane 仅用于 HTML,所以我不确定这个建议是否有效。

对于第二种情况,您可以只使用垂直滚动条并将其值设置为滚动条最大值。

于 2013-10-26T21:20:27.327 回答