| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「JTextComponent 2」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==JTextComponent 2== [Jython JTextComponent 2][Jython Swing][Swing][Jython][Python] ===内容=== =====DocumentFilterの利用===== Document 変更メソッドのフ…」)
 
 
(同じ利用者による、間の3版が非表示)
1行目: 1行目:
==JTextComponent 2==
+
==[[JTextComponent 2]]==
[Jython JTextComponent 2][Jython Swing][Swing][Jython][Python]
+
[[Jython JTextComponent 2]] | [[Jython Swing]] | [[Swing]] | [[Jython]] | [[Python]] |
  
 
===内容===
 
===内容===
12行目: 12行目:
 
  import java.awt.BorderLayout;
 
  import java.awt.BorderLayout;
 
   
 
   
  import javax.swing.JFrame;
+
  import javax.swing.[[JFrame]];
 
  import javax.swing.JScrollPane;
 
  import javax.swing.JScrollPane;
 
  import javax.swing.JTextArea;
 
  import javax.swing.JTextArea;
  import javax.swing.SwingUtilities;
+
  import javax.swing.[[Swing]]Utilities;
 
  import javax.swing.text.AbstractDocument;
 
  import javax.swing.text.AbstractDocument;
 
  import javax.swing.text.AttributeSet;
 
  import javax.swing.text.AttributeSet;
26行目: 26行目:
 
   */
 
   */
 
  public class JTextTest2 {
 
  public class JTextTest2 {
   private JFrame frame;
+
   private [[JFrame]] frame;
 
    
 
    
 
   private void createUI() {
 
   private void createUI() {
     frame = new JFrame("TextTest2");
+
     frame = new [[JFrame]]("TextTest2");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
     frame.setDefaultCloseOperation([[JFrame]].EXIT_ON_CLOSE);
 
   
 
   
 
     JTextArea txtArea = new JTextArea(10, 30);
 
     JTextArea txtArea = new JTextArea(10, 30);
39行目: 39行目:
 
     ((AbstractDocument)doc).setDocumentFilter(new EchoDocumentFilter());
 
     ((AbstractDocument)doc).setDocumentFilter(new EchoDocumentFilter());
 
   
 
   
     frame.getContentPane().add(new JScrollPane(txtArea), BorderLayout.CENTER);
+
     frame.getContentPane().add(new JScrollPane(txtArea), BorderLayout.CENTE[[R]]);
 
      
 
      
 
     frame.pack();
 
     frame.pack();
45行目: 45行目:
 
   }
 
   }
 
   public static void main(String[] args) {
 
   public static void main(String[] args) {
     SwingUtilities.invokeLater(
+
     [[Swing]]Utilities.invokeLater(
         new Runnable(){
+
         new [[R]]unnable(){
 
           public void run() {
 
           public void run() {
 
             JTextTest2 jft = new JTextTest2();
 
             JTextTest2 jft = new JTextTest2();

2020年2月16日 (日) 04:28時点における最新版

JTextComponent 2

Jython JTextComponent 2 | Jython Swing | Swing | Jython | Python |

内容

DocumentFilterの利用

Document 変更メソッドのフィルタです。DocumentFilter を格納する Document が、insert または remove を介して変更されると、適当なメソッド呼び出しが DocumentFilter に転送されます。

ソースコード

実行例

0741 jtext2.jpg

ソースコード
import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;

/**
 * @see http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html#commands
 */
public class JTextTest2 {
  private JFrame frame;
  
  private void createUI() {
    frame = new JFrame("TextTest2");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTextArea txtArea = new JTextArea(10, 30);

    // Documentを取得し、DocumentFilterをセット
    // 一旦、AbstractDocumentにキャストする必要あり
    Document doc = txtArea.getDocument();
    ((AbstractDocument)doc).setDocumentFilter(new EchoDocumentFilter());

    frame.getContentPane().add(new JScrollPane(txtArea), BorderLayout.CENTER);
    
    frame.pack();
    frame.setVisible(true);
  }
  public static void main(String[] args) {
    SwingUtilities.invokeLater(
        new Runnable(){
          public void run() {
            JTextTest2 jft = new JTextTest2();
            jft.createUI();
          }
        }
    );
  }
  
  /** 
   * 日本語入力中はinsertStringとremoveが交互に走る。入力が確定するとreplaceが走る。
   * コピー&ペースト等での入力でCALLされた場合insertStringが走る。
   * 英数字の入力で入力した場合replaceが走る
   * DeleteやBackSpaceで消す場合はremoveが走る。(ちなみに、消す対象が同じ場合offsetの値もlengthの値も変わらない)
   * @see http://ryumago.dragon-breath.net/home/program/memo.html
   */
  class EchoDocumentFilter extends DocumentFilter {
    @Override
    public void insertString(FilterBypass fb, 
                         int offset, 
                         String string, 
                         AttributeSet attr) throws BadLocationException {
      
      System.out.println("insertString : " + string);
      fb.insertString(offset, string, attr);
    }
    @Override
    public void remove(FilterBypass fb, int offset, int length) throws BadLocationException {
      System.out.println("remove");
      fb.remove(offset, length);
    }
    @Override
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
      System.out.println("replace : " + text);
      fb.replace(offset, length, text + text, attrs);
    }
  }
}