【发布时间】:2016-06-03 18:21:54
【问题描述】:
我想在我的项目中实现这种类型的文本字段
我编写了一个画家类来为我的文本字段设置背景。
这是我的 主类,我在其中将 Nimbus 设置为外观:
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.UIManager;
class NimbusBaseDemo extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
JTextField jtxt, txtDisEnabled;
int i;
private UIManager.LookAndFeelInfo[] lafs;
public NimbusBaseDemo() {
try {
// Set nimbus look and feel. nimbusBase works only for it.
new NimbusBaseUI();
} catch (Exception e) {
e.printStackTrace();
}
setTitle("Nimbus Base Demo");
setSize(400, 400);
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
jtxt = new JTextField();
jtxt = new JTextField("Enabled Text Field");
jtxt.setEnabled(true);
add(jtxt);
// Disabled text field
txtDisEnabled = new JTextField("Disabled Text Field");
txtDisEnabled.setEnabled(false);
add(txtDisEnabled);
}
public static void main(String args[]) {
new NimbusBaseDemo();
}
}
这是我的 nimbus 主题类,在这里我扩展了 NimbusLookAndFell 类并根据需要设置默认值。
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
public class NimbusBaseUI extends NimbusLookAndFeel {
public NimbusBaseUI() {
super(); // Initialisation and installating
try {
new TextFieldTheme(this);
UIManager.setLookAndFeel(this);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void initialize() {
// TODO Auto-generated method stub
super.initialize();
}
}
这是我在 NimbusBaseUI 类中使用的文本字段主题类
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import javax.swing.Painter;
public class TextFieldTheme {
public TextFieldTheme(NimbusBaseUI nimbusUI) {
nimbusUI.getDefaults().put("TextField.opaque", false);
nimbusUI.getDefaults().put("TextField.font",
new Font("Myriad Pro Light", Font.PLAIN, 13));
nimbusUI.getDefaults().put("TextField[Enabled].textForeground",
new Color(0, 0, 0));
nimbusUI.getDefaults().put("TextField.contentMargins",
new Insets(2, 10, 2, 2));
nimbusUI.getDefaults().put("TextField[Enabled].contentMargins",
new Insets(2, 10, 2, 2));
nimbusUI.getDefaults().put("TextField[Disabled].contentMargins",
new Insets(2, 10, 2, 2));
nimbusUI.getDefaults().put(
"TextField[Enabled].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put(
"TextField[Focused].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put(
"TextField[Selected].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put(
"TextField[MouseOver].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put(
"TextField[Enabled+Focused].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put(
"TextField[Enabled+Selected].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put(
"TextField[Enabled+MouseOver].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put("TextField[Disabled].textForeground",
new Color(0, 0, 0));
nimbusUI.getDefaults().put(
"TextField[Disabled].backgroundPainter",
new TextFeildPaintBorder(new Color(255, 255, 255), new Color(
255, 255, 255)));
nimbusUI.getDefaults().put(
"TextField[Disabled+Focused].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put(
"TextField[Disabled+Selected].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
nimbusUI.getDefaults().put(
"TextField[Disabled+MouseOver].backgroundPainter",
new TextFeildPaintBorder(new Color(0, 0, 255), new Color(255,
255, 255)));
}
public class TextFeildPaintBorder implements Painter {
private Color light, dark;
private GradientPaint gradPaint;
protected int strokeSize = 1;
/** Color of shadow */
/** Color of shadow */
protected Color shadowColor = new Color(128, 128, 128, 140);
/** Sets if it drops shadow */
protected boolean shady = true;
/** Sets if it has an High Quality view */
protected boolean highQuality = false;
/** Double values for Horizontal and Vertical radius of corner arcs */
protected Dimension arcs = new Dimension(10, 10);
/** Distance between shadow border and opaque panel border */
protected int shadowGap = 1;
/** The offset of shadow. */
protected int shadowOffset = 1; // width of the shadow
/** The transparency value of shadow. ( 0 - 255) */
protected int shadowAlpha = 130;
public TextFeildPaintBorder(Color light, Color dark) {
this.light = light;
this.dark = dark;
}
@Override
public void paint(Graphics2D g, Object object, int w, int h) {
Color shadowColorA = new Color(shadowColor.getRed(),
shadowColor.getGreen(), shadowColor.getBlue(), shadowAlpha);
if (highQuality) {
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
}
if (shady) {
g.setColor(shadowColorA);
g.fillRoundRect(0, 0, w - shadowGap, h - shadowGap, arcs.width,
arcs.height);
} else {
shadowGap = 1;
}
gradPaint = new GradientPaint((w / 2.0f), 0, new Color(255, 255,
255), (w / 2.0f), (h / 2.0f), new Color(255, 255, 255),
false);
g.setPaint(gradPaint);
g.fillRoundRect(shadowOffset,// X position
shadowOffset,// Y position
w - strokeSize - shadowOffset, // width
h - strokeSize - shadowOffset, // height
arcs.width, arcs.height);// arc Dimension
g.setColor(new Color(188, 188, 187, 130));
g.setStroke(new BasicStroke(strokeSize));
g.drawRoundRect(shadowOffset,// X position
shadowOffset,// Y position
w - strokeSize - shadowOffset, // width
h - strokeSize - shadowOffset, // height
arcs.width, arcs.height);// arc Dimension
g.setStroke(new BasicStroke());
}
}
}
编译运行后我得到了这个:
【问题讨论】:
-
谢谢@JordiCastilla
-
发布MCVE。请务必将您的代码复制粘贴到新项目,并确保在将其发布到此处之前编译并运行。
-
@user1803551 根据您的建议进行了更改。现在你可以看看这个。
-
当我运行你的代码时,我得到一个空框架(检查你的
setVisible调用)。此外,TextFeildPaintBorder什么也不做,因为您没有使用它设置的字段。请修复您的代码。 (int i;是干什么用的?)