2016-05-11 14 views
0

ちょっと質問/問題があります。Java Swing StyledDocument get要素ツリー/ SelectedText太字のイタリック体のようなスタイル

テキスト編集のための小さなプログラムを作成する必要があります。 (選択された)テキストはスタイルでなければなりません。太字、イタリック、アンダーライン、右揃え。 素晴らしいです。私は特定のStyleEditorKitアクションを使用しました。

私の問題は、このアクションが、jmenu/jmenubarのjtoolbarとjmenuitemsのボタンによって起動されるということです。

テキストを太字に設定する2つのクリック要素、テキストを斜体に設定する2つの要素などがあります。 1つの要素(ツールバーのボタンなど)をクリックすると、jmenuitemも選択/アクティブ化する必要があります。 しかし、どうやってこれを実現することができますか?

私の考えは、選択されたテキストをチェックすることです(CaretListenerが実装されています)。テキストが太字であれば、>ボタンとメニューがアクティブになります。 しかし、selectedTextが太字/斜体などの場合、どうすれば入手できますか?

私は、このようなもののためにリーフ付きのStyledDocumentツリーがあると思います。しかし、どうすればこの木を手に入れることができますか?どのように私は葉を得ることができますか?私は木の上に反復処理し、葉/太字や斜体の要素を取得できますか[email protected]

jTextPane1.addCaretListener(new CaretListener() { 

    @Override 
    public void caretUpdate(CaretEvent e) { 
     Highlight[] h = jTextPane1.getHighlighter().getHighlights(); 
     for(int i = 0; i < h.length; i++) { 
      System.out.println(h[i].getStartOffset()); 
      System.out.println(h[i].getEndOffset()); 
      String selectedText = jTextPane1.getSelectedText(); 


      StyledDocument styleddoc = (StyledDocument) jTextPane1.getDocument(); 

      System.out.println(styleddoc); 

     } 

    } 
}); 

しかし、私は取得のみ:

これが私の最初のステップです?

はselectedTextがなど太字/イタリックであればどのように私は得ることができますか?あなたの

答えて

0

ありがとうございましたか

ごCaretListenerで使用することができます:一つの要素(ツールバーの例えばボタン)がクリックされた場合

AttributeSet attributes = jTextPane1.getCharacterAttributes(); 
System.out.println(attributes.containsAttribute(StyleConstants.Bold, Boolean.TRUE)); 

、のJMenuItemが選択されなければならない/あまり活性化しました。

あなたはActionを使用する必要があります。

Action bold = new StyledEditorKit.BoldAction(); 
JButton boldButton = new JButton(bold); 
JCheckBoxMenuItem boldMenuItem = new JCheckBoxMenuItem(bold); 

あなたがActionの状態を設定すると、Actionを使用して、すべてのコンポーネントの状態が変更されます。たとえば、Actionを選択または有効にすることができます。

+0

ありがとうございました。 属性のあるものは機能します。しかし、私は私の全体のテキストを選択した場合、それは偽を返します...私は最後の文字なしですべてを選択した場合、それは真を返します... 私はBoldActionを使用しました。ボタンを選択または有効にする必要がありますか? –

+0

System.out.println(attributes.containsAttribute(StyleConstants.Italic、Boolean.TRUE))); それは毎回falseを返します... –

+0

'私のテキスト全体を選択すると、falseを返します。 ' - 選択したテキストの個々の文字を繰り返し処理できると思います。すべての文字は太字でなければなりません。有効になっていない場合は、ボタンをクリックすることはできません。ボタンを有効または選択しないでください。あなたはアクションを変更します。 – camickr

0

私のコードは、申し訳ありません

public void jToolBarInitButtons() { 

    jTextPane1.addCaretListener(new CaretListener() { 

    @Override 
    public void caretUpdate(CaretEvent e) { 

     StyledDocument styleddoc = (StyledDocument) jTextPane1.getDocument(); 

      AttributeSet attributes = jTextPane1.getCharacterAttributes(); 
      System.out.println("bold " + attributes.containsAttribute(StyleConstants.Bold, Boolean.TRUE)); 
      System.out.println("italic " + attributes.containsAttribute(StyleConstants.Italic, Boolean.TRUE)); 

    } 
+0

これはSSCCEではありません。私はそのコードをコンパイルできません。フレーム、テキストパネル、ボタンはありません。だから私は問題があるかどうかを調べるためにそれをテストすることはできません。 – camickr

0

次のようになります。

アップデート2:これは、全体のコードで、ここでのコード

public class TestFrame extends javax.swing.JFrame { 

    /** 
    * Creates new form TestFrame 
    */ 
    public TestFrame() { 
     initComponents(); 
     initButtons(); 
    } 

    Action boldAction = new StyledEditorKit.BoldAction();  
    Action italicAction = new StyledEditorKit.ItalicAction(); 
    Action underlineAction = new StyledEditorKit.UnderlineAction(); 

    public void initButtons() { 
     JButton boldButton = new JButton(boldAction); 
     boldButton.setText("bold"); 

     JButton italicButton = new JButton(italicAction); 
     boldButton.setText("italic"); 

     JButton underlineButton = new JButton(underlineAction); 
     boldButton.setText("underline"); 

     jToolBar1.add(boldButton); 
     jToolBar1.add(italicButton); 
     jToolBar1.add(underlineButton); 

     jTextPane1.addCaretListener(new CaretListener() { 

     @Override 
     public void caretUpdate(CaretEvent e) { 
      Highlighter.Highlight[] h = jTextPane1.getHighlighter().getHighlights(); 
      for(int i = 0; i < h.length; i++) { 
       System.out.println("length " + h.length); 
       System.out.println(h[i].getStartOffset()); 
       System.out.println(h[i].getEndOffset()); 
       String selectedText = jTextPane1.getSelectedText(); 


       StyledDocument styleddoc = (StyledDocument) jTextPane1.getDocument(); 

       AttributeSet attributes = jTextPane1.getCharacterAttributes(); 
       System.out.println("Bold " + attributes.containsAttribute(StyleConstants.Bold, Boolean.TRUE)); 
       System.out.println("Italic " + attributes.containsAttribute("Italic " + StyleConstants.Italic, Boolean.TRUE)); 
       System.out.println("Underline " + attributes.containsAttribute(StyleConstants.Underline, Boolean.TRUE)); 
      } 

     } 
    }); 
    } 

    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTextPane1 = new javax.swing.JTextPane(); 
     jToolBar1 = new javax.swing.JToolBar(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jScrollPane1.setViewportView(jTextPane1); 

     jToolBar1.setRollover(true); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap(116, Short.MAX_VALUE) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 269, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(75, 75, 75)) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(23, 23, 23) 
       .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(14, 14, 14) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 154, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(89, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold>       

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(TestFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new TestFrame().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JTextPane jTextPane1; 
    private javax.swing.JToolBar jToolBar1; 
    // End of variables declaration     
} 
+0

何が起こると思いますか?私があなたに与えたコードは、最後のキャレット位置だけを見ています。したがって、選択が太字のテキストで終わる場合はtrueになり、それ以外の場合はfalseになります。選択したテキストの各文字をテストするメソッドを作成する必要があると提案しました。裸のキャラクターが見つかるとすぐに、あなたは偽を返します。あなたが文字列の最後に到達するとtrueを返します。 – camickr

+0

私の問題は、最後の文字の後にキャレットが終わるとfalseを返すことです。 大胆な「こんにちは」があり、すべてを選択して 'o'の後に停止すると、falseを返します...真ではありません。しかし、すべて、こんにちは大胆です。 –

0

があるので、そうであったテキストを斜体に設定するテキスト太字、2つの要素を設定するには、2つのクリックの要素があり、 。 1つの要素(ツールバーのボタンなど)がクリックされた場合、jmenuitemも選択/アクティブ化する必要があります。しかし、どうすればこれを実現できますか?

メニュー項目とボタンの両方を、コンストラクタに同じActionを渡して作成します。

ボタンやメニュー項目に太い状態を表示するように思えるので、おそらくJCheckBoxMenuItemとJToggleButtonを作成したいと思うでしょう。あなたがアクションを作成すると、null以外の値にそのSELECTED_KEYが設定されているので、ボタンは、現在までにそれを維持します:

action.putValue(Action.SELECTED_KEY, false); 

アクションのドキュメントから:

SELECTED_KEY

コンポーネントこのプロパティを尊重するのは、値がnullでない場合にのみ値を使用することです。たとえば、SELECTED_KEYのヌル値を持つActionJToggleButtonに設定した場合、JToggleButtonは選択状態を更新しません。同様に、JToggleButtonの選択された状態が変更されると、ActionSELECTED_KEYの値がnullである場合にのみ、Actionの値が戻されます。このプロパティを使用するコンポーネントは、選択した状態をこのプロパティと同期させて保持します。複数のコンポーネントで同じActionを使用すると、すべてのコンポーネントは選択した状態をこのプロパティと同期した状態に保ちます。

あなたのCaretListenerはcamickr describedである必要があります。

+0

これは私のコードですが、 boldActionにはputValueメソッドがありません。 アクションboldAction = new StyledEditorKit.BoldAction(); アクションitalicAction = new StyledEditorKit.ItalicAction(); アクションunderlineAction = new StyledEditorKit.UnderlineAction(); –

+0

@ TorbenGボタンとメニュー項目の両方でそれぞれを使用する場合は、アクションごとにputValue(Action.SELECTED_KEY、false)を呼び出す必要があります。 – VGR

+0

多分私はあまりにも愚かですが、それは私のために働くdoesntの... boldAction.putValue(Action.SELECTED_KEY、false); –

関連する問題