Почему бы вам не совместить оба ваших подхода.Пока вы редактируете, отобразите текстовый компонент, в противном случае закрасьте весь текст, используя TextLayout
.В следующем примере кода показан такой подход, расширяющий простое JComponent
.Он рисует прямоугольную форму с текстом в нем, и если вы щелкнете внутри, это показывает возможность редактирования.Как только вы снова нажмете снаружи, компонент исчез.Обратите внимание, что в этом базовом примере отсутствуют все функции обработки редактирования.
class TestComponent extends JComponent {
JTextArea jta = new JTextArea("12345");
public TestComponent() {
setPreferredSize(new Dimension(400, 400));
setLayout(null);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (e.getX() >= 40 && e.getX() <= 200 && e.getY() >= 40 && e.getY() <= 80) {
TestComponent.this.add(jta);
jta.setBounds(42, 42, 156, 36);
} else {
TestComponent.this.remove(jta);
}
repaint();
}
});
}
});
}
@Override
public void paintComponent(Graphics _g) {
Graphics2D g = (Graphics2D) _g;
g.drawRect(40, 40, 160, 40);
TextLayout layout = new TextLayout("12345", g.getFont(), g.getFontRenderContext());
layout.draw(g, 42, 42 + layout.getAscent());
}
}