0
A
回答
5
的基本概念是像任何正常摇摆形式。你只需要添加一些额外的工作来将它们放在一起。
你需要决定的第一件事是你想要多行支持吗?
下面的示例简单地使用JLayeredPane
来提供自由布局,并使用自定义JTextArea
来提供可编辑字段。
对此的整洁的事情是调整大多是照顾你,因为是“重新编辑”,只需点击文本,你会明白我的意思。
我会离开重新定位给你;)
public class TextOverImage {
public static void main(String[] args) {
new TextOverImage();
}
public TextOverImage() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ImagePane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class ImagePane extends JLayeredPane {
private BufferedImage background;
public ImagePane() {
setFocusable(true);
try {
background = ImageIO.read(new File("Your/image/here"));
} catch (Exception e) {
e.printStackTrace();
}
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Component focusOwner = FocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
if (!(focusOwner instanceof OverlayEditor)) {
OverlayEditor field = new OverlayEditor();
field.setLocation(e.getPoint());
add(field);
invalidate();
repaint();
field.requestFocusInWindow();
} else {
requestFocusInWindow();
}
}
});
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel");
am.put("cancel", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
Component focusOwner = FocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
if (focusOwner instanceof OverlayEditor) {
remove(focusOwner);
invalidate();
repaint();
}
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (background != null) {
int x = (getWidth() - background.getWidth());
int y = (getHeight() - background.getHeight());
g.drawImage(background, x, y, this);
}
}
}
public class OverlayEditor extends JTextArea {
public OverlayEditor() {
super(1, 10);
setBorder(null);
setForeground(Color.WHITE);
setOpaque(false);
setSize(getPreferredSize());
getDocument().addDocumentListener(new DocumentListener() {
public void update() {
setSize(getPreferredSize());
}
@Override
public void insertUpdate(DocumentEvent e) {
update();
}
@Override
public void removeUpdate(DocumentEvent e) {
update();
}
@Override
public void changedUpdate(DocumentEvent e) {
update();
}
});
addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
setBorder(new LineBorder(Color.WHITE));
repaint();
}
@Override
public void focusLost(FocusEvent e) {
setBorder(null);
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
if (hasFocus()) {
g2d.setColor(new Color(0, 0, 0, 32));
g2d.fill(new Rectangle(getWidth(), getHeight()));
}
g2d.dispose();
}
}
}
+0
谢谢,您的宝贵回应。 – NSR
+0
感谢您提出一个有趣的问题;) – MadProgrammer
相关问题
- 1. 如何添加Jpanel中的jpanel imagepanel?
- 2. 如何在JPanel(在JPanel)paint方法上添加图像?
- 3. 如何对齐JPanel中的JPanel内的Jbuttons JPanel内
- 4. 如何旋转JPanel?
- 5. 如何刷新JPanel?
- 6. 如何扩展JPanel
- 7. 如何访问JPanel?
- 8. 如何刷新JPanel?
- 9. 如何在另一个JPanel内的JPanel上绘制Graphics2D?
- 10. 如何在周围的JPanel底部对齐这些JPanel?
- 11. 如何在另一个JPanel中添加随机坐标的JPanel?
- 12. 如何将JPanel放在另一个JPanel上?
- 13. 如何在JDialog的JPanel中添加MapView以及另一个JPanel
- 14. 如何在另一个JPanel的中心添加一个JPanel?
- 15. 如何在另一个JPanel内的JPanel上绘制形状?
- 16. 我是如何在jpanel中将jpanel与netbeans对中的?
- 17. 如何在JPanel中添加JButton?
- 18. 如何在JPanel上画圆? Java 2D
- 19. 如何在jquery中动态创建JPanel?
- 20. 如何绘制JPanel在挥杆
- 21. 如何在CLONE JPanel中绘制paint()?
- 22. 如何在框架中添加JPanel
- 23. 如何在JPanel边框中使用JButton?
- 24. 如何在JScrollPane中显示JPanel?
- 25. 如何在Jpanel中显示incanter图表
- 26. 如何在java中打印jpanel?
- 27. 如何在画布上绘制JPanel?
- 28. 如何在JPanel上播放mp4视频?
- 29. 如何在JPanel上找到主色?
- 30. 如何在JPanel中加载图像?
请张贴[SSCCE(http://sscce.org)准确地告诉你做了什么,在哪里你卡住了,或者问题可能会被关闭,因为它不是一个真正的问题IMO –
您可以使用透明的JTextArea。将“DocumentListener”添加到该区域的文档中。当输入内容时,调整区域大小。 – StanislavL
现在我可以使用g.drawString(text,(int)p.getX(),(int)p.getY())来绘制文本。在图像上,但我想使用键盘输入直接在图像上绘制文本。 – NSR