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);
}
}