《Swing Hacks》中说:Swing的各种特性中最没有被充分利用的就是其部分重写绘图代码的能力,在改善窗口外观时,大部分程序要么使用渲染器,要么就完全重绘代码,其实通过部分重写绘图代码,就能创建很有用的绘图效果。实际代码如下,部分注释解释了其原理:
package com.qing;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class WatermarkTextField extends JTextField {
private static final long serialVersionUID = 1L;
public static final Image LOG = new ImageIcon(
WatermarkTextField.class.getResource("/resource/images/LOG.png"))
.getImage();
private BufferedImage img;
private TexturePaint texture;
/**
* 构造函数通过传递一张图作为其背景图
*
* @param file:图像文件
* @throws IOException
*/
public WatermarkTextField(File file) throws IOException {
// 通过文件的方式获取BufferedImage
img = ImageIO.read(file);
// 根据指定图像的大小创建一个基准矩形,此矩形和图像大小相等(如果想矩形小一点,,也可绘制部分)
Rectangle rect = new Rectangle(0, 0, img.getWidth(null),
img.getHeight(null));
/** TexturePaint 类提供一种用于被指定为 BufferedImage 的纹理填充 Shape 的方式 **/
texture = new TexturePaint(img, rect);
// 使此文本框透明
setOpaque(false);
}
@Override
public void paintComponent(Graphics g) {
/** 在调用父类的绘图方法前绘制好背景 **/
Graphics2D g2 = (Graphics2D) g;
// 为 Graphics2D 设置 TexturePaint 属性
g2.setPaint(texture);
// 获取文本框的的大小,并将其全部填充
g.fillRect(0, 0, getWidth(), getHeight());
// 然后重用父类的绘图方法,比如绘制文本字符信息等
super.paintComponent(g);
}
//到此已经完成文本框背景图的重绘,下面进行测试
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame("Swing Hacks 005:添加背景的文本框");
frame.setIconImage(LOG);
JTextField textfield = new WatermarkTextField(new File(
WatermarkTextField.class
.getResource("/resource/images/red.png").toURI()));
textfield.setText(" Thia ia a TextField ");
textfield.setFont(textfield.getFont().deriveFont(50f));//设置文本字体
frame.getContentPane().add(textfield, BorderLayout.NORTH);
frame.pack();
frame.setVisible(true);
}
}
效果如下:
- 大小: 25.3 KB
分享到:
相关推荐
Java中的`JTextField`是Swing库中一个基础的组件,用于创建文本输入字段。它允许用户输入单行文本,并且通常与`Document`对象关联,`Document`管理`JTextField`中的数据。在标准的`JTextField`中,虽然没有内置的...
#### 一、背景与需求分析 在开发基于Java Swing的应用程序时,我们经常需要处理用户输入数据的有效性检查。例如,在一个简单的数值输入框(`JTextField`)中,可能需要限制用户仅能输入数字,并且这个数字还需要在一...
- **`Highlighter` 接口**:这是一个允许用户用带有颜色的区域标出文本背景的对象接口。它定义了如何在文本组件上创建、删除和修改高亮显示的方法。 - **`addHighlight()` 方法**:此方法用于向文本组件添加高亮显示...
在Java Swing应用中,为了提升用户体验,经常需要为`JTextField`添加“自动完成”(Auto-Completion)功能。这个功能允许用户在输入文本时,系统能够自动匹配并显示可能的建议,类似于搜索引擎或邮件客户端的地址...
实现圆角矩形边框,hint文字,主要代码: ... JTextField textField = (JTextField) c; if ("".equals(textField.getText())) { g2d.setColor(Color.BLACK); g2d.drawString("请输入文字...", 10, 18); }
JTextField_Example.java
可以通过`setFont()`改变字体,`setForeground()`和`setBackground()`改变前景和背景颜色。 8. **组合使用** JTextField常与JLabel搭配使用,形成用户界面的标准输入框。例如: ```java JLabel label = new ...
在Java Swing库中,`JTextField`是一个常用的组件,用于接收用户输入的文本。当我们需要在用户输入时实时检查或限制输入的字符数量,比如实现位数监听,我们可以利用`DocumentListener`接口来达成目标。这个接口允许...
在Java Swing中,`JTextField` 是一个常用的组件,用于接收用户输入的单行文本。在实际应用中,我们可能需要对用户输入进行控制,比如限制输入的字符类型、长度或者格式,以满足特定的需求。这篇博客“控制...
在Java Swing应用开发中,有时候我们需要提供一种更加用户友好的输入方式,比如在输入框(JTextField)中输入内容时,能实时根据已输入的字符给出匹配建议,以辅助用户快速选择目标信息。这种功能常见于订机票时输入...
它是 javax.swing.JTextField 类的实例,可以通过多种方式创建,例如不带参数的构造方法、带文本参数的构造方法、带列数参数的构造方法等。 常用构造方法 JTextField 有多种构造方法,例如: * `JTextField()`: ...
Text_JTextField.class
在完成Swing的学习后,练习使用Swing包中JFrame、JButton、JLabel、JTextField、JMenu、JMenuItem等组件完成图形界面绘制。 前期能够独立思考并完成计算器的逻辑代码。 熟练使用JButton、JTextField、JLabel等...
- **初始化变量**:这里定义了多个Swing组件,包括`JFrame`、`JTextField`、`JLabel`和`JButton`等,以及`ImageIcon`和`Image`对象用于存储背景图片。 ```java void init() { load.setBounds(560, 300, 350, 220)...
以上代码示例展示了如何在Swing中创建一个带有背景图片的登录界面,并将登录表单组件放置在图片之上。当然,实际应用中可能还需要考虑更多的细节,比如响应式设计、错误处理和用户交互等。对于初学者来说,理解并...
JTextField是Java Swing库中的一个组件类,用于接收用户的文本输入。
首先,我们需要理解`JTextField`和`JPasswordField`的基本用法。`JTextField`是一个单行文本输入框,用户可以在其中输入任意字符。`JPasswordField`则用于隐藏输入的字符,通常用于输入密码,显示为星号或圆点。 ...
JTextField jurl=new JTextField(60); JEditorPane jEditorPanel=new JEditorPane(); JScrollPane scrollPane=new JScrollPane(jEditorPanel); // JWindow window=new JWindow(WebBrowser.this); // Toolkit ...
在Java Swing中,文本框(JTextField)和文本区(JTextArea)是两个常见的组件,用于接收用户的文本输入。它们是构建用户界面的重要元素,通常用于数据输入或者多行文本展示。 一、JTextField(文本框)的使用 1. 构造...