2

JPanel に JTextArea を保持させようとしています。すべてのテキストを表示するために必要なサイズであるため、JTextArea の preferredSize に一致するように JPanel 自体のサイズを変更する必要があります。最終的には、JTextArea と Jpanel の間に空の境界線を配置したいのですが、サンプル コードではそれを省略しました。

また、JPanel に境界線を付けたいと考えています。以下のコードは時々動作しますが、lineBorder の下部と右側の部分が消えることがあります。なぜこうなった?PS サイズを更新する方法があまりエレガントではないことはわかっています。より良い方法はありますか?

コードは次のとおりです。

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;

public class TextThoughtView extends JPanel {
    private JTextArea myTextArea;

    TextThoughtView(){
        //configure the View
        setBackground(new Color(0, 0, 0, 0));
        setLayout(new BorderLayout());
        myTextArea = new JTextArea();
        add(myTextArea,BorderLayout.CENTER);

        //configure the border
        Border border = BorderFactory.createLineBorder(new Color(150,150,150));
        setBorder(border);

        //configure the textArea
        Font font = new Font("Monospaced", Font.BOLD, 12);
        myTextArea.setFont(font);
        myTextArea.setBackground(new Color(50, 50, 50)); //same as the color of the canvas.
        myTextArea.setForeground(new Color(255, 255, 255)); //sets the text color
        //myTextArea.setBorder(new EmptyBorder(new Insets(5,5,5,5)));
        myTextArea.getDocument().addDocumentListener(new MyDocumentListener()); //add a listener for text changes
        myTextArea.setSize(new Dimension(10,20));

        //sync this's size with the textArea
        sizeToFitTextArea();

    }
    //accessors
    private void sizeToFitTextArea(){
        setSize(myTextArea.getPreferredSize().width,myTextArea.getPreferredSize().height);
    }
    private class MyDocumentListener implements DocumentListener {
        public void insertUpdate(DocumentEvent e) {
            sizeToFitTextArea();
        }
        public void removeUpdate(DocumentEvent e) {
            sizeToFitTextArea();
        }
        public void changedUpdate(DocumentEvent e) {
            //Plain text components do not fire these events
        }
    }
    public static void main(String args[]){
        JFrame myFrame = new JFrame();
        myFrame.setLayout(new BorderLayout());
        myFrame.setSize(new Dimension(400,300));

        JPanel myPanel = new JPanel();
        myPanel.add(new TextThoughtView());
        myPanel.setBackground(new Color(50,50,50));
        myFrame.add(myPanel,BorderLayout.CENTER);
        myFrame.setVisible(true);
     }
}
4

1 に答える 1

1

私の問題の解決策は、各サイズ変更イベントの後に revalidate() を呼び出すことでした。@MadProgrammer によると、サイズ変更は通常、レイアウト マネージャーによって行われ、無効化/再検証に応答して呼び出されるため、これは理にかなっています。

于 2012-12-27T16:43:12.427 に答える