要求在文本框中输入#abc#时,固定的水印文字显示在文本框中心位置,默认不显示。
以下是一个基本的Java记事本程序的示例代码,其中包含了实现水印的方法:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
public class TextEditor extends JFrame {
private JTextArea textArea;
private JScrollPane scrollPane;
private BufferedImage watermarkImage;
public TextEditor() {
super("Text Editor");
// create the text area
textArea = new JTextArea();
textArea.setFont(new Font("Arial", Font.PLAIN, 15));
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
// create the scroll pane
scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
// create the panel for the buttons
JPanel buttonPanel = new JPanel();
// create the "open" button and add an action listener
JButton openButton = new JButton("Open");
openButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showOpenDialog(TextEditor.this) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
FileReader reader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(reader);
String line;
while ((line = bufferedReader.readLine()) != null) {
textArea.append(line + "\n");
}
bufferedReader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
buttonPanel.add(openButton);
// create the "save" button and add an action listener
JButton saveButton = new JButton("Save");
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showSaveDialog(TextEditor.this) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
try {
FileWriter writer = new FileWriter(file);
writer.write(textArea.getText());
writer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
buttonPanel.add(saveButton);
// add the scroll pane and button panel to the frame
add(scrollPane, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
// set the size and center the frame
setSize(600, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// load the watermark image
try {
watermarkImage = ImageIO.read(new File("watermark.png"));
} catch (IOException e1) {
e1.printStackTrace();
}
// add a listener for changes to the text area
textArea.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
if (textArea.getText().contains("#abc#")) {
// the watermark should be displayed
textArea.setUI(new javax.swing.plaf.basic.BasicTextAreaUI() {
@Override
protected void paintSafely(Graphics g) {
super.paintSafely(g);
// set the watermark image and position
g.drawImage(watermarkImage, (getWidth() - watermarkImage.getWidth()) / 2, (getHeight() - watermarkImage.getHeight()) / 2, null);
}
});
} else {
// the watermark should not be displayed
textArea.setUI(new javax.swing.plaf.basic.BasicTextAreaUI());
}
textArea.repaint();
}
});
}
public static void main(String[] args) {
TextEditor editor = new TextEditor();
editor.setVisible(true);
}
}
此程序使用一个JTextArea组件,一个JScrollPane组件,和两个JButton组件。JTextArea用于输入和显示文本,JScrollPane提供滚动功能,JButton用于打开和保存文本文件。
水印是在textArea的UI上实现的。当textArea中的文本内容包含“#abc#”时,UI将设置为一个BasicTextAreaUI,然后在paintSafely()方法中。 在此处,将显示水印图像在textArea的中心位置上。如果没有检测到“#abc#”,则将UI设置回BasicTextAreaUI,不显示水印。