g.drawImage(image, 0,0,null);
Вы рисуете изображение в его реальном размере. Если это ваше реальное требование, просто используйте JLabel с ImageIcon. JLabel по умолчанию отображает изображение в его предпочтительном размере и вычисляет предпочтительный размер этикетки как размер изображения.
Если ваше требование состоит в том, чтобы масштабировать изображение при изменении размера рамки, тогда да, вам нужно будет выполнить пользовательскую покраску, но затем вы должны использовать:
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
для динамического масштабирования изображения.
Когда я попробовал frame.add (textArea), все изображение не будет отображаться.
При использовании BorderLayout, и вы не указываете ограничение, тогда предполагается BorderLayout.CENTER
. Вы не можете добавить два компонента в ЦЕНТР фрейма.
Так что вам нужно добавить текстовую область на панель изображений (либо ваш пользовательский компонент, либо JLabel:
JPanel background = new ComponentImage();
background.setLayout(...);
background.add( textArea );
Обратите внимание, что если вы выполняете пользовательскую рисование на JPanel, для макета по умолчанию устанавливается FlowLayout. Если вы выполняете пользовательское рисование на JComponent, у него не будет менеджера по умолчанию, поэтому вам нужно будет установить его.