0

したがって、私のアプリケーションでは、JTextPane の拡張であるカスタム コンポーネントを使用します。スタイリングのためにこれを拡張する必要があります。このコンポーネントは JTextField として機能することを意図しているため、ワード ラッピングをオフにすることができました。つまり、マルチラインではありません。

ただし、私が直面している問題は、テキストが表示領域の外側にまたがる場合、JTextPane が JScrollpane 内で使用されていない場合、ワードラップされていないテキストをうまく処理できないように見えることです。JTextField を使用する場合のように、可視領域外のテキストを移動することはできません。

JTextComponent を前提とする多くのレガシー コードがあるため、JScrollpane を使用したくありません。

だから私の質問は、表示領域をキャレット位置に合わせてインラインに保つ方法はありますか?これにより、入力が表示エッジに到達するか、表示領域の外側にまたがるテキストを選択しようとすると、そのテキストが JTextField のようにビューに移動します。

私の問題の実例を以下に示します。JTextPane の上に JTextField が表示されます。テキスト フィールドに入力すると、表示領域がテキストとともに移動することがわかります。テキスト ペインに入力すると、これは発生しません。

また、Java 7でこれを行っています。

前もって感謝します。

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class NoAutoScroll {
    public NoAutoScroll() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextField textField = new JTextField();
        textField.setText("This text field can show the text outside the visible area.");
        textField.setPreferredSize(new Dimension(150, 30));

        JTextPane textPane = new JTextPane();
        textPane.setEditorKit(new MyEditorKit());
        textPane.setText("This text pane cannot show the text outside the visible area.");
        textPane.setPreferredSize(new Dimension(150, 30));
        textPane.setBorder(textField.getBorder());

        JPanel mainPanel = new JPanel(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.gridx = 0;
        constraints.gridy = 0;
        mainPanel.add(new JLabel("JTextField"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 0;
        mainPanel.add(textField, constraints);
        constraints.gridx = 0;
        constraints.gridy = 1;
        mainPanel.add(new JLabel("JTextPane"), constraints);
        constraints.gridx = 1;
        constraints.gridy = 1;
        mainPanel.add(textPane, constraints);

        frame.add(mainPanel);
        frame.pack();
        frame.setVisible(true);
    }

    public class MyViewFactory implements ViewFactory {

        private final class NonBreakingLabelView extends LabelView {
            private NonBreakingLabelView(Element elem) {
                super(elem);
            }

            @Override
            public int getBreakWeight(int axis, float pos, float len){
                return BadBreakWeight;
            }
        }

        @Override
        public View create(final Element elem) {
            String kind = elem.getName();
            if (kind != null) {
                if (kind.equals(AbstractDocument.ContentElementName)) {
                return new NonBreakingLabelView(elem);
                } else if (kind.equals(AbstractDocument.ParagraphElementName)) {
                    return new ParagraphView(elem);
                } else if (kind.equals(AbstractDocument.SectionElementName)) {
                return new BoxView(elem, View.Y_AXIS);
                } else if (kind.equals(StyleConstants.ComponentElementName)) {
                return new ComponentView(elem);
                } else if (kind.equals(StyleConstants.IconElementName)) {
                return new IconView(elem);
                }
            }

            // default to text display
            return new LabelView(elem);
        }
    }

    @SuppressWarnings("serial")
    public class MyEditorKit extends StyledEditorKit {

        @Override
        public ViewFactory getViewFactory() {
            return new MyViewFactory();
        }
    }

    public static void main(String[] args) {
        new NoAutoScroll();
    }
}
4

1 に答える 1

2

正しい方法

  • なしJScrollPaneでは不可能です。両方を非表示にすることができますJScrollBars

汚いハック

  • を 2 つ保持すると、second と visible は に追加されたマウス イベントからDocumentのみ生成されますが、 を使用する理由はありません。代わりに、ScrollIncrememtJTextPaneJTextPaneJLabel
于 2012-11-14T14:57:01.387 に答える