62,616
社区成员
发帖
与我相关
我的任务
分享
package com.han;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* The result is :
* <p>
* If you use pack(), use the setPref() method when you want to resize
* components; If you do not use the Layout Manager, employ the combined
* methods: setLayout(null) + Components.setBounds()
*
* @author HAN
*
*/
@SuppressWarnings("serial")
public class PanelTest extends JFrame {
static JPanel panel;
static JButton button;
public PanelTest() {
// TODO Auto-generated constructor stub
Container c = getContentPane();
panel = new JPanel() {
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Image img = Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/images/Luxun.jpg"));
g2.drawImage(img, 0, 0, this);
}
};
c.add(panel, BorderLayout.CENTER);
// panel.setPreferredSize(new Dimension(200, 250));
System.out.println(panel.getPreferredSize());
System.out.println(panel.getSize());
button = new JButton("Test");
panel.add(button);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PanelTest frame = new PanelTest();
frame.pack();
frame.setSize(new Dimension(500, 500));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
System.out.println(panel.getSize());
System.out.println(panel.getPreferredSize());
}
}
public boolean contains(int x, int y)
private class MyButton extends JButton {
private String text;
private String state = "normal";
// private String state = "focused";
// private String state = "pressed";
// private String state = "released";
// 无参构造继承时自动调用,而有参构造继承时则需手动重写
MyButton(String text) {
// super("<html><font size=5>" + text + "</font></html>");
super(text);
this.text = text;
// 下 面的代码块若是放到下面的paintComponent()方法里则Swing界面初始化时,
// 布局管理器还是采用的是系统默认的PreferredSize。因为构造函数要优先于
// paintComponent()方法执行。
Dimension preferredSize = getPreferredSize();
Dimension preferredSizeNew = new Dimension(preferredSize.width,
preferredSize.width);
setPreferredSize(preferredSizeNew);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int width = this.getPreferredSize().width;
int height = this.getPreferredSize().height;
// BufferedImage img;
// try {
// img = ImageIO.read(this.getClass().getResource(
// "/images/icon.jpg"));
// g2.drawImage(img, 0, 0, width, height, this);
// } catch (IOException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
if (state.equals("normal")) {
// draw background pattern
Point2D center = new Point2D.Float(width / 2, height / 2);
float radius = height / 2;
float[] dist = { 0.0f, 1.0f };
Color[] colors = { new Color(0, 0, 0, 255),
new Color(255, 255, 255, 0) };
RadialGradientPaint paint = new RadialGradientPaint(center,
radius, dist, colors);
g2.setPaint(paint);
g2.fill(new Ellipse2D.Double(width / 2 - height / 2, 0, height,
height));
// draw string text
g2.setColor(Color.RED);
Font defaultFont = getFont();
g2.setFont(defaultFont);
Rectangle2D rect = defaultFont.getStringBounds(text,
g2.getFontRenderContext());
LineMetrics lineMetrics = defaultFont.getLineMetrics(text,
g2.getFontRenderContext());
g2.drawString(
text,
(float) (width / 2 - rect.getWidth() / 2),
(float) ((height / 2) + ((lineMetrics.getAscent() + lineMetrics
.getDescent()) / 2 - lineMetrics.getDescent())));
} else if (state.equals("focused")) {
// draw background pattern
Point2D center = new Point2D.Float(width / 2, height / 2);
float radius = height / 2;
float[] dist = { 0.2f, 1.0f };
Color[] colors = { new Color(0, 0, 0, 255),
new Color(255, 255, 255, 0) };
RadialGradientPaint paint = new RadialGradientPaint(center,
radius, dist, colors);
g2.setPaint(paint);
g2.fill(new Ellipse2D.Double(width / 2 - height / 2, 0, height,
height));
// draw string text
g2.setColor(Color.RED);
Font defaultFont = getFont();
g2.setFont(defaultFont);
Rectangle2D rect = defaultFont.getStringBounds(text,
g2.getFontRenderContext());
LineMetrics lineMetrics = defaultFont.getLineMetrics(text,
g2.getFontRenderContext());
g2.drawString(
text,
(float) (width / 2 - rect.getWidth() / 2),
(float) ((height / 2) + ((lineMetrics.getAscent() + lineMetrics
.getDescent()) / 2 - lineMetrics.getDescent())));
} else if (state.equals("pressed")) {
// draw background pattern
int offsetCenter = 1;
Point2D center = new Point2D.Float(width / 2 + offsetCenter,
height / 2 + offsetCenter);
float radius = height / 2;
float[] dist = { 0.2f, 1.0f };
Color[] colors = { new Color(0, 0, 0, 255),
new Color(255, 255, 255, 0) };
RadialGradientPaint paint = new RadialGradientPaint(center,
radius, dist, colors);
g2.setPaint(paint);
g2.fill(new Ellipse2D.Double(width / 2 - height / 2
+ offsetCenter, offsetCenter, height, height));
// draw string text
g2.setColor(Color.RED);
Font defaultFont = getFont();
g2.setFont(defaultFont);
Rectangle2D rect = defaultFont.getStringBounds(text,
g2.getFontRenderContext());
LineMetrics lineMetrics = defaultFont.getLineMetrics(text,
g2.getFontRenderContext());
g2.drawString(
text,
(float) (width / 2 - rect.getWidth() / 2)
+ offsetCenter,
(float) ((height / 2) + ((lineMetrics.getAscent() + lineMetrics
.getDescent()) / 2 - lineMetrics.getDescent()))
+ offsetCenter);
} else if (state.equals("released")) {
// draw background pattern
Point2D center = new Point2D.Float(width / 2, height / 2);
float radius = height / 2;
float[] dist = { 0.2f, 1.0f };
Color[] colors = { new Color(0, 0, 0, 255),
new Color(255, 255, 255, 0) };
RadialGradientPaint paint = new RadialGradientPaint(center,
radius, dist, colors);
g2.setPaint(paint);
g2.fill(new Ellipse2D.Double(width / 2 - height / 2, 0, height,
height));
// draw string text
g2.setColor(Color.RED);
Font defaultFont = getFont();
g2.setFont(defaultFont);
Rectangle2D rect = defaultFont.getStringBounds(text,
g2.getFontRenderContext());
LineMetrics lineMetrics = defaultFont.getLineMetrics(text,
g2.getFontRenderContext());
g2.drawString(
text,
(float) (width / 2 - rect.getWidth() / 2),
(float) ((height / 2) + ((lineMetrics.getAscent() + lineMetrics
.getDescent()) / 2 - lineMetrics.getDescent())));
}
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("光标移入组件");
state = "focused";
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("光标移出组件");
state = "normal";
repaint();
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
System.out.print("鼠标按键被按下,");
state = "pressed";
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
System.out.print("鼠标按键被释放,");
state = "released";
repaint();
}
});
}
}
drawImage(image, x, y, null);
This is what you will see for the drawImage() calls in our demo code, as we generally
use BufferedImage objects.
package com.han;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JSlider;
import javax.swing.Painter;
import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.UIManager.LookAndFeelInfo;
@SuppressWarnings("serial")
public class JSlider_customized extends JFrame {
public JSlider_customized() {
// TODO Auto-generated constructor stub
for (LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
if (laf.getName().equals("Nimbus")) {
try {
UIManager.setLookAndFeel(laf.getClassName());
} catch (ClassNotFoundException | InstantiationException
| IllegalAccessException
| UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
JPanel panel = new JPanel(new GridLayout(0, 1, 20, 20));
JSlider slider = new JSlider(0, 100, 50);
Container c = getContentPane();
c.add(panel, BorderLayout.CENTER);
panel.setBackground(Color.DARK_GRAY);
panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
panel.add(slider);
UIDefaults sliderDefaults = new UIDefaults();
sliderDefaults.put("Slider.thumbWidth", 20);
sliderDefaults.put("Slider.thumbHeight", 20);
sliderDefaults.put("Slider:SliderThumb.backgroundPainter",
new Painter<JComponent>() {
public void paint(Graphics2D g, JComponent c, int w, int h) {
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setStroke(new BasicStroke(2f));
g.setColor(Color.RED);
g.fillOval(1, 1, w - 3, h - 3);
g.setColor(Color.WHITE);
g.drawOval(1, 1, w - 3, h - 3);
Image img = Toolkit.getDefaultToolkit().getImage(
JSlider_customized.class
.getResource("/images/Luxun.jpg"));
g.drawImage(img, 0, 0, w, h, null);
}
});
sliderDefaults.put("Slider:SliderTrack.backgroundPainter",
new Painter<JComponent>() {
public void paint(Graphics2D g, JComponent c, int w, int h) {
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setStroke(new BasicStroke(2f));
g.setColor(Color.GRAY);
g.fillRoundRect(0, 6, w - 1, 8, 8, 8);
g.setColor(Color.WHITE);
g.drawRoundRect(0, 6, w - 1, 8, 8, 8);
}
});
slider.putClientProperty("Nimbus.Overrides", sliderDefaults);
slider.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
JSlider slider2 = new JSlider(0, 100, 50);
panel.add(slider2);
}
/**
* @param args
*/
public static void main(String[] args) {
// JFrame.setDefaultLookAndFeelDecorated(true);
JSlider_customized frame = new JSlider_customized();
// frame.setUndecorated(true);
// frame.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);
frame.pack();// leaves the frame layout manager in charge of the frame
// size, so that all its contents are at or above their
// preferred sizes
// frame.setLocation(100, 100); // set the frame location
frame.setLocationRelativeTo(null); // centers a frame onscreen
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}