QA@IT

StyleConstantsのsetAlignmentについて

1953 PV

はじめまして。
私は今、javaでテキストエディタを作成しております。

現在、テキスト欄に文字を入力して、文字の表示位置を変更する機能を実装しています。
作成中のテキストエディタは、入力した内容をHTMLソースとして表示する機能があります。

問題点
・文字の表示位置を変更し、HTMLソースとして表示した後、
再度テキスト入力欄に戻り、文字の表示位置を変更して、
HTMLソースを表示すると、ソース上では文字の表示位置が変化していない。

自作したソースをアップしましたので、
チェックしていただけると助かります。

よろしくお願い致します。


import java.awt.;
import java.awt.event.
;
import javax.swing.;
import javax.swing.event.
;
import javax.swing.text.*;
import javax.swing.text.html.HTMLEditorKit;

public class FreeMultiFontEditor extends JFrame{

private JSplitPane jspltDisplay;
private JTextPane textpane;
private JScrollPane jspTextpane;
private Document htmlDoc;
private HTMLEditorKit htmlKit;
private int selstart,selend;
private JTextArea htmlArea;
private JScrollPane jspSource;
private JButton leftButton;
private JButton centerbutton;
private JButton rightbutton;
private JButton bothalignbutton;
private JButton btnHtml;

/* Variables */
private int iSplitPos = 0;

private boolean exclusiveEdit = true;

// コンストラクタ。基本コンポーネントの準備
public FreeMultiFontEditor(){
    setTitle("入力画面");

    try{
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    }catch(Exception e) {
        e.printStackTrace();
    }

    getContentPane().setBackground(Color.WHITE);

    GridBagLayout gridBagLayout = new GridBagLayout();
    gridBagLayout.columnWidths = new int[]{0, 34, 0, 15, 0, 47, 10, 0};
    gridBagLayout.rowHeights = new int[]{26, 17, 25, 432, 38, 0};
    gridBagLayout.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
    gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE};
    getContentPane().setLayout(gridBagLayout);

    textpane = new JTextPane();
    htmlKit = new HTMLEditorKit();
    htmlDoc = htmlKit.createDefaultDocument();
    htmlKit.setDefaultCursor(new Cursor(Cursor.TEXT_CURSOR));
    textpane.setCursor(new Cursor(Cursor.TEXT_CURSOR));

    //Jtextpaneの初期設定
    textpane.setEditorKit(htmlKit);
    textpane.setDocument(htmlDoc);
    textpane.setMargin(new Insets(4, 4, 4, 4));
    textpane.addCaretListener(new caretAction());
    textpane.setCaretPosition(0);

    //htmlAreaの初期設定
    htmlArea = new JTextArea();
    htmlArea.setText(textpane.getText());
    htmlArea.setMargin(new Insets(4, 4, 4, 4));
    htmlArea.setCursor(new Cursor(Cursor.TEXT_CURSOR));

    jspTextpane = new JScrollPane(textpane);
    jspTextpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

    GridBagConstraints gbc_spane = new GridBagConstraints();
    gbc_spane.insets = new Insets(0, 0, 5, 0);
    gbc_spane.gridwidth = 19;
    gbc_spane.fill = GridBagConstraints.BOTH;
    gbc_spane.gridx = 0;
    gbc_spane.gridy = 3;

    jspSource = new JScrollPane(htmlArea);

    //JSplitPaneを用いて、画面切り替え
    jspltDisplay = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    jspltDisplay.setTopComponent(jspTextpane);

    iSplitPos = jspltDisplay.getDividerLocation();

    btnHtml = new JButton("HTMLソース編集");
    btnHtml.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionevent) {
            htmledit();
        }
    });

    bothalignbutton = new JButton();
    bothalignbutton.setText("両端揃え");
    bothalignbutton.setToolTipText("両端揃え");
    bothalignbutton.setMargin(new Insets(2, 10, 2, 10));
    bothalignbutton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            //両端揃えに
            SimpleAttributeSet attr = new SimpleAttributeSet();
            StyleConstants.setAlignment(attr,StyleConstants.ALIGN_JUSTIFIED);
            StyledDocument doc = textpane.getStyledDocument();
            //doc.setCharacterAttributes(selstart,selend - selstart,attr,false);
            doc.setParagraphAttributes(selstart,selend - selstart,attr,false);

        }
    });

    rightbutton = new JButton();
    rightbutton.setText("右揃え");
    rightbutton.setToolTipText("右揃え");
    rightbutton.setMargin(new Insets(2, 10, 2, 10));
    rightbutton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionevent) {

            //右揃えに
            SimpleAttributeSet attr = new SimpleAttributeSet();
            StyleConstants.setAlignment(attr,StyleConstants.ALIGN_RIGHT);
            StyledDocument doc = textpane.getStyledDocument();
            //doc.setCharacterAttributes(selstart,selend - selstart,attr,false);
            doc.setParagraphAttributes(selstart,selend - selstart,attr,false);

        }
    });

    centerbutton = new JButton();
    centerbutton.setText("中央揃え");
    centerbutton.setToolTipText("中央揃え");
    centerbutton.setMargin(new Insets(2, 10, 2, 10));
    centerbutton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionevent) {

            //中央揃えに
            SimpleAttributeSet attr = new SimpleAttributeSet();
            StyleConstants.setAlignment(attr,StyleConstants.ALIGN_CENTER);
            StyledDocument doc = textpane.getStyledDocument();
            //doc.setCharacterAttributes(selstart,selend - selstart,attr,false);
            doc.setParagraphAttributes(selstart,selend - selstart,attr,false);

        }
    });

    leftButton = new JButton();
    leftButton.setText("左揃え");
    leftButton.setToolTipText("左揃え");
    leftButton.setMargin(new Insets(2, 10, 2, 10));
    leftButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent actionevent) {

            //左揃えに
            SimpleAttributeSet attr = new SimpleAttributeSet();
            StyleConstants.setAlignment(attr,StyleConstants.ALIGN_LEFT);
            StyledDocument doc = textpane.getStyledDocument();
            //doc.setCharacterAttributes(selstart,selend - selstart,attr,false);
            doc.setParagraphAttributes(selstart,selend - selstart,attr,false);

        }
    });
    leftButton.setMaximumSize(new Dimension(27, 9));
    leftButton.setIcon(null);
    GridBagConstraints gbc_btnNewButton1 = new GridBagConstraints();
    gbc_btnNewButton1.insets = new Insets(0, 0, 5, 5);
    gbc_btnNewButton1.gridx = 2;
    gbc_btnNewButton1.gridy = 1;
    getContentPane().add(leftButton, gbc_btnNewButton1);
    centerbutton.setIcon(null);
    GridBagConstraints gbc_button1 = new GridBagConstraints();
    gbc_button1.insets = new Insets(0, 0, 5, 5);
    gbc_button1.gridx = 3;
    gbc_button1.gridy = 1;
    getContentPane().add(centerbutton, gbc_button1);
    rightbutton.setIcon(null);
    GridBagConstraints gbc_button_11 = new GridBagConstraints();
    gbc_button_11.insets = new Insets(0, 0, 5, 5);
    gbc_button_11.gridx = 4;
    gbc_button_11.gridy = 1;
    getContentPane().add(rightbutton, gbc_button_11);
    bothalignbutton.setIcon(null);
    GridBagConstraints gbc_button_21 = new GridBagConstraints();
    gbc_button_21.insets = new Insets(0, 0, 5, 5);
    gbc_button_21.gridx = 5;
    gbc_button_21.gridy = 1;
    getContentPane().add(bothalignbutton, gbc_button_21);

    GridBagConstraints gbc_splitPane = new GridBagConstraints();
    gbc_splitPane.gridwidth = 7;
    gbc_splitPane.insets = new Insets(0, 0, 5, 5);
    gbc_splitPane.fill = GridBagConstraints.BOTH;
    gbc_splitPane.gridx = 0;
    gbc_splitPane.gridy = 3;
    getContentPane().add(jspltDisplay, gbc_splitPane);

    GridBagConstraints gbc_btnHtml = new GridBagConstraints();
    gbc_btnHtml.insets = new Insets(0, 0, 0, 5);
    gbc_btnHtml.gridx = 5;
    gbc_btnHtml.gridy = 4;
    getContentPane().add(btnHtml, gbc_btnHtml);
    //this.newDoc();
    this.setSize(new Dimension(817, 595));
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}



public static void main(String[] args) {
    try{
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    }catch(Exception e) {
        e.printStackTrace();
    }

    new FreeMultiFontEditor().setVisible(true);
}


protected boolean isSourceWindowActive()
{
    return (jspSource != null && jspSource == jspltDisplay.getRightComponent());
}


//HTMLソース編集ボタン押下
protected void htmledit()
{
    if(!(isSourceWindowActive()))
    {

        //Jtextpaneの内容をhtmlAreaに挿入
        htmlArea.setText(textpane.getText());

        jspltDisplay.setRightComponent(jspSource);
        if(exclusiveEdit)
        {
            jspltDisplay.setDividerLocation(0);
            jspltDisplay.setEnabled(false);
            htmlArea.requestFocus();
        }
        else
        {
            jspltDisplay.setDividerLocation(iSplitPos);
            jspltDisplay.setEnabled(true);
        }
    }
    else
    {
        if(htmlArea.isEditable())
        {
            //htmlAreaの内容をJtextpaneに挿入
            textpane.setText(htmlArea.getText());
        }
        iSplitPos = jspltDisplay.getDividerLocation();
        jspltDisplay.remove(jspSource);
        textpane.requestFocus();
    }
    this.validate();

    btnHtml.setSelected(isSourceWindowActive());
}

// JTextPaneのCaretListenerクラス
class caretAction implements CaretListener {
    public void caretUpdate(CaretEvent ev) {
        selstart = textpane.getSelectionStart();
        selend = textpane.getSelectionEnd();
    }
}

}

  • 手元にJavaの環境がなく試せないのですが、`GridBagLayout`と`GridBagConstraints`の使用方法がおかしいように思います。
    1. `GridBagConstraints`のインスタンス数は、`GridBagLayout`のインスタンス数と同じで、1対1になります。
    2. レイアウトマネージャーに対して、コンポーネント(ボタンなど)を配置します。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。