我要實現這種類型的文本字段的在我的項目如何在Java swing中使用GradientPaint實現陰影效果?
我寫了一個畫家類設置背景爲我的文本字段。
這是我主類我在其中設置雨雲爲外觀和感覺:
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();
}
}
,這是我的靈氣主題類,在這裏我向NimbusLookAndFell類和setdefaults因爲我想要的。
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());
}
}
}
compaile和運行我得到這個後:
更新問題添加圖像和澄清:)希望你能找到一個答案......可能[this](http://stackoverflow.com/questions/13368103/jpanel-drop-shadow/13369038#13369038)或[this](http://stackoverflow.com/questions/15233526/image-with-shadow-and -r呃 - 邊緣在Java的鞦韆)可以幫助 –
謝謝@JordiCastilla – Kathi
發佈[MCVE](http://stackoverflow.com/help/mcve)。一定要將你的代碼複製粘貼到一個*新的項目中*,並確保它在發佈之前編譯並運行。 – user1803551