자바-JFrame 창 미화 방식
JFrame 미화 의 대체적인 사고방식:먼저 JFrame 을 기본 미화 효 과 를 제거 하고 JWindow 효 과 를 실현 한 다음 에 JWindow 를 바탕 으로 창의 각종 내용 에 대한 사용자 정의 설정 과 미화,대부분 배경 그림 삽입,각종 마우스 이벤트 추가,팝 업 창 과 입력 상자 등 원 각 등 각종 미화 에 사용 된다.
다음은 로그 인 창의 미화 코드 입 니 다.나중에 창 을 미화 할 때 코드 를 참조 하여 미화 할 수 있 습 니 다.
1.로그 인 실체 코드:
package com;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;
import java.awt.geom.RoundRectangle2D;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JLabel;
import com.alibaba.fastjson.JSON;
import com.model.Message;
import com.model.User;
import com.sun.awt.AWTUtilities;
import com.util.FileUtils;
import com.util.MyButton;
import com.util.MyLineBorder;
import com.util.VerifyCodeUtils;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTextField;
import javax.swing.border.MatteBorder;
import javax.swing.JPasswordField;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
/**
* ( )
* @author admin
*
*/
public class Login1{
private JFrame frame;//
private JTextField userNameField;//
private JPasswordField passwordField;//
private JTextField verifyCodeField;//
private String verifyCode;//
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Login1 window = new Login1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Login1() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
//
FileUtils.deleteAllFiles("./verifyCodeImg");
//
MyLineBorder myLineBorder = new MyLineBorder(new Color(192, 192, 192), 1 , true);
//
MatteBorder bottomBorder = new MatteBorder(0, 0, 1, 0, new Color(192, 192, 192));
// JFrame , ;
JFrame.setDefaultLookAndFeelDecorated(true);
frame = new JFrame();
frame.setBounds(0, 0, 300, 490);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
/**
*
*/
//
frame.setLocationRelativeTo(frame.getOwner());
//
frame.setUndecorated(true);
//
frame.getRootPane().setWindowDecorationStyle(JRootPane.NONE);
// , 、 ,
AWTUtilities.setWindowShape(frame,
new RoundRectangle2D.Double(0.0D, 0.0D, frame.getWidth(), frame.getHeight(), 20.0D, 20.0D));
// , frame.getContentPane() , frame
frame.getContentPane().setBackground(Color.white);
/**
*
*/
// JLayeredPane
JLayeredPane layeredPane = new JLayeredPane();
layeredPane.setBounds(0, -5, 300, 200);
frame.getContentPane().add(layeredPane);
//
ImageIcon img = new ImageIcon(Login1.class.getResource("/images/dingbu.jpg"));
// 、
img.setImage(img.getImage().getScaledInstance(300, 200,Image.SCALE_DEFAULT));
JPanel panel = new JPanel();
panel.setBounds(0, -5, 300, 200);
layeredPane.add(panel, JLayeredPane.DEFAULT_LAYER);
JLabel lblNewLabel = new JLabel("");
panel.add(lblNewLabel);
lblNewLabel.setIcon(img);
/**
*
*/
//
ImageIcon closeImg = new ImageIcon(Login1.class.getResource("/images/close.png"));
// 、
closeImg.setImage(closeImg.getImage().getScaledInstance(31, 31,Image.SCALE_DEFAULT));
JPanel closePanel = new JPanel();
closePanel.setBounds(269, -5, 31, 31);
layeredPane.add(closePanel,JLayeredPane.MODAL_LAYER);
JLabel closeLabel = new JLabel("");
closePanel.add(closeLabel);
closeLabel.setIcon(closeImg);
closeLabel.addMouseListener(new MouseAdapter() {
// ,
@Override
public void mouseClicked(MouseEvent e) {
//dispose();
System.exit(0);// dispose();
}
// ,
@Override
public void mouseEntered(MouseEvent e) {
//
ImageIcon closeImg1 = new ImageIcon(Login1.class.getResource("/images/mouse_close.png"));
// 、
closeImg1.setImage(closeImg1.getImage().getScaledInstance(31, 31,Image.SCALE_DEFAULT));
closeLabel.setIcon(closeImg1);
}
// ,
@Override
public void mouseExited(MouseEvent e) {
//
ImageIcon closeImg = new ImageIcon(Login1.class.getResource("/images/close.png"));
// 、
closeImg.setImage(closeImg.getImage().getScaledInstance(31, 31,Image.SCALE_DEFAULT));
closeLabel.setIcon(closeImg);
}
});
/**
*
*/
//
ImageIcon minImg = new ImageIcon(Login1.class.getResource("/images/min.png"));
// 、
minImg.setImage(minImg.getImage().getScaledInstance(31, 31,Image.SCALE_DEFAULT));
JPanel minPanel = new JPanel();
minPanel.setBounds(237, -5, 31, 31);
layeredPane.add(minPanel,JLayeredPane.MODAL_LAYER);
JLabel minLabel = new JLabel("");
minLabel.addMouseListener(new MouseAdapter() {
// ,
@Override
public void mouseClicked(MouseEvent e) {
frame.setExtendedState(JFrame.ICONIFIED);//
}
// ,
@Override
public void mouseEntered(MouseEvent e) {
//
ImageIcon minImg1 = new ImageIcon(Login1.class.getResource("/images/mouse_min.png"));
// 、
minImg1.setImage(minImg1.getImage().getScaledInstance(31, 31,Image.SCALE_DEFAULT));
minLabel.setIcon(minImg1);
}
// ,
@Override
public void mouseExited(MouseEvent e) {
//
ImageIcon minImg = new ImageIcon(Login1.class.getResource("/images/min.png"));
// 、
minImg.setImage(minImg.getImage().getScaledInstance(31, 31,Image.SCALE_DEFAULT));
minLabel.setIcon(minImg);
}
});
minPanel.add(minLabel);
minLabel.setIcon(minImg);
/**
*
*/
//
ImageIcon userNameImg = new ImageIcon(Login1.class.getResource("/images/user_name.png"));
// 、
userNameImg.setImage(userNameImg.getImage().getScaledInstance(40, 40,Image.SCALE_DEFAULT));
JLabel userNameLabel = new JLabel("");
userNameLabel.setBounds(0, 220, 40, 40);
userNameLabel.setIcon(userNameImg);
//
userNameLabel.setFocusable(true);
frame.getContentPane().add(userNameLabel);
/**
*
*/
userNameField = new JTextField();
userNameField.setBounds(50, 220, 235, 50);
userNameField.setBorder(bottomBorder);
userNameField.setText(" ");
userNameField.setFont(new Font(" ", 0, 14));
userNameField.setForeground(Color.GRAY);//
userNameField.addFocusListener(new FocusAdapter() {
//
@Override
public void focusGained(FocusEvent e) {
// , “ ”, ;
if(" ".equals((userNameField.getText().trim()))){
userNameField.setText("");
userNameField.setForeground(Color.black);//
}
}
//
@Override
public void focusLost(FocusEvent e) {
// ,
if("".equals((userNameField.getText().trim()))){
userNameField.setText(" ");
userNameField.setFont(new Font(" ", 0, 14));
userNameField.setForeground(Color.GRAY);//
}
}
});
frame.getContentPane().add(userNameField);
userNameField.setColumns(10);
/**
*
*/
//
ImageIcon passwordImg = new ImageIcon(Login1.class.getResource("/images/password.png"));
// 、
passwordImg.setImage(passwordImg.getImage().getScaledInstance(40, 40,Image.SCALE_DEFAULT));
JLabel passwordLabel = new JLabel("");
passwordLabel.setBounds(0, 280, 40, 40);
passwordLabel.setIcon(passwordImg);
frame.getContentPane().add(passwordLabel);
/**
*
*/
passwordField = new JPasswordField();
passwordField.setBounds(50, 280, 235, 50);
passwordField.setBorder(bottomBorder);
passwordField.setText(" ");
passwordField.setFont(new Font(" ", 0, 14));
passwordField.setForeground(Color.GRAY);//
passwordField.setEchoChar((char)0);//
passwordField.addFocusListener(new FocusAdapter() {
//
@Override
public void focusGained(FocusEvent e) {
// , “ ”, ;
if(" ".equals((passwordField.getText().trim()))){
passwordField.setText("");
passwordField.setEchoChar('*');//
passwordField.setForeground(Color.black);//
}
}
//
@Override
public void focusLost(FocusEvent e) {
// ,
if("".equals((passwordField.getText().trim()))){
passwordField.setText(" ");
passwordField.setFont(new Font(" ", 0, 14));
passwordField.setForeground(Color.GRAY);//
passwordField.setEchoChar((char)0);//
}
}
});
frame.getContentPane().add(passwordField);
/**
*
*/
//
ImageIcon verifyCodeImg = new ImageIcon(Login1.class.getResource("/images/verify_code.png"));
// 、
verifyCodeImg.setImage(verifyCodeImg.getImage().getScaledInstance(40, 40,Image.SCALE_DEFAULT));
JLabel verifyCodeLabel = new JLabel("");
verifyCodeLabel.setBounds(0, 340, 40, 40);
verifyCodeLabel.setIcon(verifyCodeImg);
frame.getContentPane().add(verifyCodeLabel);
/**
*
*/
verifyCodeField = new JTextField();
verifyCodeField.setBounds(50, 340, 135, 50);
verifyCodeField.setBorder(bottomBorder);
verifyCodeField.setText(" ");
verifyCodeField.setFont(new Font(" ", 0, 14));
verifyCodeField.setForeground(Color.GRAY);//
verifyCodeField.addFocusListener(new FocusAdapter() {
//
@Override
public void focusGained(FocusEvent e) {
// , “ ”, ;
if(" ".equals((verifyCodeField.getText().trim()))){
verifyCodeField.setText("");
verifyCodeField.setForeground(Color.black);//
}
}
//
@Override
public void focusLost(FocusEvent e) {
// ,
if("".equals((verifyCodeField.getText().trim()))){
verifyCodeField.setText(" ");
verifyCodeField.setFont(new Font(" ", 0, 14));
verifyCodeField.setForeground(Color.GRAY);//
}
}
});
frame.getContentPane().add(verifyCodeField);
verifyCodeField.setColumns(10);
/**
*
*/
JLabel verifyCodeImgLabel = new JLabel("");
verifyCodeImgLabel.setBounds(190, 340, 95, 50);
verifyCodeImgLabel.setBorder(myLineBorder);
frame.getContentPane().add(verifyCodeImgLabel);
//
verifyCode = VerifyCodeUtils.createOneCodeImage();
//
ImageIcon verifyCodeSourceImg = new ImageIcon("./verifyCodeImg/"+verifyCode+".jpg");//
// 、
verifyCodeSourceImg.setImage(verifyCodeSourceImg.getImage().getScaledInstance(95, 50,Image.SCALE_DEFAULT));
verifyCodeImgLabel.setIcon(verifyCodeSourceImg);
// ,
verifyCodeImgLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//
File file = new File("./src/verifyCodeImg/"+verifyCode+".jpg");
if(file.exists()){
file.delete();
}
//
verifyCode = VerifyCodeUtils.createOneCodeImage();
ImageIcon verifyCodeSourceImg1 = new ImageIcon("./verifyCodeImg/"+verifyCode+".jpg");
verifyCodeSourceImg1.setImage(verifyCodeSourceImg1.getImage().getScaledInstance(95, 50,Image.SCALE_DEFAULT));
verifyCodeImgLabel.setIcon(verifyCodeSourceImg1);
}
});
/**
* JLabel
*/
JLabel reminderMessage = new JLabel("",JLabel.CENTER);
reminderMessage.setBounds(15, 395, 270, 20);
reminderMessage.setForeground(Color.red);
reminderMessage.setFont(new Font(" ", 0, 12));
frame.getContentPane().add(reminderMessage);
/**
*
*/
MyButton myButton = new MyButton(" ", 0);
myButton.setBounds(15, 420, 270, 50);
frame.getContentPane().add(myButton);
//
frame.setVisible(true);
}
}
2.도구 류 FileUtils 코드:
package com.util;
import java.io.File;
/**
*
* @author admin
*
*/
public class FileUtils {
/**
* , ,
*/
public static Boolean deleteAllFiles(String filePath){
Boolean result = false;
File file = new File(filePath);
File temp = null;
if(file.exists()){
String [] tempList = file.list();
for (String string : tempList) {
temp = new File(filePath+"/"+string);
if(temp.isFile()){
temp.delete();
}
}
tempList = file.list();
if(tempList.length==0){
result = true;
}
}
return result;
}
public static void main(String[] args) {
Boolean result = FileUtils.deleteAllFiles("./verifyCodeImg");
System.out.println(result);
}
}
3.도구 류 MyButton 코드:
package com.util;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
*
* @author admin
*
*/
public class MyButton extends JButton {
/* */
public static int radius = 4;
public static Color COLOR1, COLOR2;
public static int pink = 3, ashen = 2, sky = 1, stone = 0;
/* */
public static Color pink1 = new Color(39, 121, 181);
public static Color pink2 = new Color(39, 121, 181);
/* */
public static Color ashen1 = new Color(39, 121, 181);
public static Color ashen2 = new Color(39, 121, 181);
/* */
public static Color stone1 = new Color(39, 121, 181);
public static Color stone2 = new Color(39, 121, 181);
/* */
public static Color sky1 = new Color(39, 121, 181);
public static Color sky2 = new Color(39, 121, 181);
/* */
private boolean hover;
public MyButton() {
this("", stone);
}
public MyButton(String name) {
this(name, stone);
}
public MyButton(String name, int style) {
super.setText(name);
if (style == pink) {
COLOR1 = pink1;
COLOR2 = pink2;
}
if (style == ashen) {
COLOR1 = ashen1;
COLOR2 = ashen2;
}
if (style == stone) {
COLOR1 = stone1;
COLOR2 = stone2;
}
if (style == sky) {
COLOR1 = sky1;
COLOR2 = sky2;
}
paintcolor(COLOR1, COLOR2);
}
private void paintcolor(Color COLOR1, Color COLOR2) {
setMargin(new Insets(0, 0, 0, 0));
setFont(new Font(" ", 0, 14));
setBorderPainted(false);
setForeground(Color.white);
setFocusPainted(false);
setContentAreaFilled(false);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g.create();
int height = getHeight();
int with = getWidth();
float tran = 0.9F;
/*if (!hover) { /
tran = 0.6F;
}*/
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
/* GradientPaint */
GradientPaint p1;
GradientPaint p2;
if (getModel().isPressed()) {
p1 = new GradientPaint(0, 0, new Color(0, 0, 0), 0, height, new Color(100, 100, 100), true);
p2 = new GradientPaint(0, 1, new Color(0, 0, 0, 50), 0, height, new Color(255, 255, 255, 100), true);
} else {
p1 = new GradientPaint(0, 0, new Color(100, 100, 100), 0, height, new Color(0, 0, 0), true);
p2 = new GradientPaint(0, 1, new Color(255, 255, 255, 100), 0, height, new Color(0, 0, 0, 50), true);
}
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, tran));
RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0, with - 1, height - 1, radius, radius);
// , ,
Shape clip = g2d.getClip();
g2d.clip(r2d);
GradientPaint gp = new GradientPaint(0.0F, 0.0F, COLOR1, 0.0F, height / 2, COLOR2, true);
g2d.setPaint(gp);
g2d.fillRect(0, 0, with, height);
g2d.setClip(clip);
g2d.setPaint(p1);
g2d.drawRoundRect(0, 0, with - 3, height - 3, radius, radius);
g2d.setPaint(p2);
g2d.drawRoundRect(1, 1, with - 3, height - 3, radius, radius);
g2d.dispose();
super.paintComponent(g);
}
public static void main(String args[]) {
JFrame frm = new JFrame();
MyButton but = new MyButton(" JButton", 0);
frm.setLayout(null);
frm.setBounds(800, 400, 500, 200);
but.setBounds(30, 30, 200, 50);
frm.add(but);
frm.setDefaultCloseOperation(3);
frm.setVisible(true);
}
}
4.도구 류 MyLineBorder 코드:
package com.util;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.border.LineBorder;
/**
*
* @author admin
*
*/
public class MyLineBorder extends LineBorder{
private static final long serialVersionUID = 1L;
public MyLineBorder(Color color, int thickness, boolean roundedCorners) {
super(color, thickness, roundedCorners);
}
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Color oldColor = g.getColor();
Graphics2D g2 = (Graphics2D)g;
int i;
g2.setRenderingHints(rh);
g2.setColor(lineColor);
for(i = 0; i < thickness; i++) {
if(!roundedCorners)
g2.drawRect(x+i, y+i, width-i-i-1, height-i-i-1);
else
g2.drawRoundRect(x+i, y+i, width-i-i-1, height-i-i-1, 10, 10); // ,
}
g2.setColor(oldColor);
}
}
5.도구 류 Verify CodeUtils 코드:
package com.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Random;
import javax.imageio.ImageIO;
/**
*
* @author admin
*
*/
public class VerifyCodeUtils {
// Algerian , , , 1,0,i,o
public static final String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
private static Random random = new Random();
/**
*
*
* @param verifySize
*
* @return
*/
public static String generateVerifyCode(int verifySize) {
return generateVerifyCode(verifySize, VERIFY_CODES);
}
/**
*
*
* @param verifySize
*
* @param sources
*
* @return
*/
public static String generateVerifyCode(int verifySize, String sources) {
if (sources == null || sources.length() == 0) {
sources = VERIFY_CODES;
}
int codesLen = sources.length();
Random rand = new Random(System.currentTimeMillis());
StringBuilder verifyCode = new StringBuilder(verifySize);
for (int i = 0; i < verifySize; i++) {
verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));
}
return verifyCode.toString();
}
/**
* ,
*
* @param w
* @param h
* @param outputFile
* @param verifySize
* @return
* @throws IOException
*/
public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException {
String verifyCode = generateVerifyCode(verifySize);
outputImage(w, h, outputFile, verifyCode);
return verifyCode;
}
/**
* ,
*
* @param w
* @param h
* @param os
* @param verifySize
* @return
* @throws IOException
*/
public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException {
String verifyCode = generateVerifyCode(verifySize);
outputImage(w, h, os, verifyCode);
return verifyCode;
}
/**
*
*
* @param w
* @param h
* @param outputFile
* @param code
* @throws IOException
*/
public static void outputImage(int w, int h, File outputFile, String code) throws IOException {
if (outputFile == null) {
return;
}
File dir = outputFile.getParentFile();
if (!dir.exists()) {
dir.mkdirs();
}
try {
outputFile.createNewFile();
FileOutputStream fos = new FileOutputStream(outputFile);
outputImage(w, h, fos, code);
fos.close();
} catch (IOException e) {
throw e;
}
}
/**
*
*
* @param w
* @param h
* @param os
* @param code
* @throws IOException
*/
public static void outputImage(int w, int h, OutputStream os, String code) throws IOException {
int verifySize = code.length();
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Random rand = new Random();
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Color[] colors = new Color[5];
Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN, Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA,
Color.ORANGE, Color.PINK, Color.YELLOW };
float[] fractions = new float[colors.length];
for (int i = 0; i < colors.length; i++) {
colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
fractions[i] = rand.nextFloat();
}
Arrays.sort(fractions);
g2.setColor(Color.GRAY);//
g2.fillRect(0, 0, w, h);
Color c = getRandColor(200, 250);
g2.setColor(c);//
g2.fillRect(0, 2, w, h - 4);
//
Random random = new Random();
g2.setColor(getRandColor(160, 200));//
for (int i = 0; i < 20; i++) {
int x = random.nextInt(w - 1);
int y = random.nextInt(h - 1);
int xl = random.nextInt(6) + 1;
int yl = random.nextInt(12) + 1;
g2.drawLine(x, y, x + xl + 40, y + yl + 20);
}
//
float yawpRate = 0.05f;//
int area = (int) (yawpRate * w * h);
for (int i = 0; i < area; i++) {
int x = random.nextInt(w);
int y = random.nextInt(h);
int rgb = getRandomIntColor();
image.setRGB(x, y, rgb);
}
shear(g2, w, h, c);//
g2.setColor(getRandColor(100, 160));
int fontSize = h - 4;
Font font = new Font("Algerian", Font.ITALIC, fontSize);
g2.setFont(font);
char[] chars = code.toCharArray();
for (int i = 0; i < verifySize; i++) {
AffineTransform affine = new AffineTransform();
affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1),
(w / verifySize) * i + fontSize / 2, h / 2);
g2.setTransform(affine);
g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);
}
g2.dispose();
ImageIO.write(image, "jpg", os);
}
private static Color getRandColor(int fc, int bc) {
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
private static int getRandomIntColor() {
int[] rgb = getRandomRgb();
int color = 0;
for (int c : rgb) {
color = color << 8;
color = color | c;
}
return color;
}
private static int[] getRandomRgb() {
int[] rgb = new int[3];
for (int i = 0; i < 3; i++) {
rgb[i] = random.nextInt(255);
}
return rgb;
}
private static void shear(Graphics g, int w1, int h1, Color color) {
shearX(g, w1, h1, color);
shearY(g, w1, h1, color);
}
private static void shearX(Graphics g, int w1, int h1, Color color) {
int period = random.nextInt(2);
boolean borderGap = true;
int frames = 1;
int phase = random.nextInt(2);
for (int i = 0; i < h1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
g.copyArea(0, i, w1, 1, (int) d, 0);
if (borderGap) {
g.setColor(color);
g.drawLine((int) d, i, 0, i);
g.drawLine((int) d + w1, i, w1, i);
}
}
}
private static void shearY(Graphics g, int w1, int h1, Color color) {
int period = random.nextInt(40) + 10; // 50;
boolean borderGap = true;
int frames = 20;
int phase = 7;
for (int i = 0; i < w1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
g.copyArea(i, 0, 1, h1, 0, (int) d);
if (borderGap) {
g.setColor(color);
g.drawLine(i, (int) d, i, 0);
g.drawLine(i, (int) d + h1, i, h1);
}
}
}
// , verifyCodeImg
public static String createOneCodeImage(){
String imgName = "";
try {
File dir = new File("./verifyCodeImg");
int w = 95, h = 50;
String verifyCode = generateVerifyCode(4);
File file = new File(dir, verifyCode + ".jpg");
outputImage(w, h, file, verifyCode);
imgName = verifyCode;
} catch (IOException e) {
imgName = "";
e.printStackTrace();
}finally{
return imgName;
}
}
public static void main(String[] args) throws IOException {
String codeImage = VerifyCodeUtils.createOneCodeImage();
System.out.println(codeImage);
}
}
자바 스윙 개요:JFrame 창 과 JDialog 창GUI(그래 픽 사용자 인터페이스)는 프로그래머 에 게 그래 픽 인 터 페 이 스 를 제공 합 니 다.최초의 디자인 목적 은 프로그래머 가 모든 플랫폼 에서 실행 할 수 있 도록 일반적인 GUI 를 구축 하 는 것 이 었 습 니 다.그러나 자바 1.0 의 기본 클래스 인 AWT(추상 적 인 창 도구 상자)는 이 요구 에 이 르 지 못 했 습 니 다.그래서 Swing 은 AWT 가 구성 한 강화 구성 이지 만 AWT 를 완전히 대체 할 수 없습니다.이 두 가지 구성 요 소 는 하나의 그래 픽 사용자 인터페이스 에 동시에 나타 나 야 한다.
스윙 구성 요소
원래 AWT 구성 요 소 는 java.awt 패키지 에서 나 왔 습 니 다.AWT 구성 요 소 를 포함 한 자바 응용 프로그램 이 서로 다른 플랫폼 에서 실 행 될 때 플랫폼 마다 GUI 구성 요소 의 디 스 플레이 가 다 르 지만 서로 다른 플랫폼 에서 Swing 이 개발 한 응용 프로그램 을 실행 할 때 GUI 구성 요소 의 디 스 플레이 스타일 을 통일 할 수 있 습 니 다.Swing 구성 요 소 는 프로그래머 가 플랫폼 을 뛰 어 넘 을 때 통 일 된 외관 과 스타일 을 지정 할 수 있 기 때 문 입 니 다.
Swing 구성 요 소 는 보통'경량급 구성 요소'라 고 불 립 니 다.자바 언어 로 만 들 어 졌 기 때문에 자바 시 운영 체제 언어 에 의존 하지 않 고 모든 플랫폼 에서 실행 할 수 있 습 니 다.반면 로 컬 플랫폼 에 의존 하 는 구성 요 소 는'헤비급 구성 요소'라 고 부 릅 니 다.예 를 들 어 AWT 구성 요 소 는 로 컬 플랫폼 의 창 시스템 에 의존 하여 구성 요소 의 기능,외관,스타일 을 결정 합 니 다.Swing 구성 요 소 는 다음 과 같은 특징 을 가지 고 있 습 니 다.
경량급 모듈
외관 구성 요소 삽입 가능
스윙 백
Swing 구성 요 소 를 효과적으로 사용 하기 위해 서 는 Swing 패키지 의 차원 구조 와 계승 관 계 를 알 아야 합 니 다.그 중에서 중요 한 것 은 Component 류,Container 류 와 JComponent 류 입 니 다.그 중에서 이 몇 가지 유형의 계승 관 계 는 다음 과 같다.
javax.swing.JComponent 계승 자:
javax.awt.Container 클래스 계승:
javax.awt.Component 계승 자:
java.lang.Object 클래스
Swing 구성 요소 중 대부분의 GUI 구성 요 소 는 Component 클래스 의 직접 하위 클래스 또는 간접 하위 클래스 이 며,JComponent 클래스 는 Swing 구성 요소 의 다양한 특성 을 저장 하 는 위치 입 니 다.이러한 구성 요소 의 특성 은 구성 요소 경계 설정,GUI 구성 요소 자동 스크롤 등 을 포함 합 니 다.
Swing 구성 요소 에서 가장 중요 한 것 은 부모 클래스 Container 클래스 입 니 다.Container 클래스 는 자바.awt.Window and 자바.awt.Frame 로 두 가지 중요 한 하위 클래스 가 있 습 니 다.기 존의 AWT 클래스 구성 요소 가 이 두 가지 종 류 를 계승 하 는 것 을 제외 하고 현재 의 Swing 구성 요소 도 이 두 가지 종 류 를 확장 하 였 습 니 다.
상용 창
창 은 스윙 응용 프로그램의 구성 요소 로 서 매우 중요 한 위치 에 있 습 니 다.스윙 에서 자주 사용 하 는 창 은 JFrame 과 JDialog 를 포함한다.
JFrame 창
JFrame 창 은 Swing 프로그램의 각 구성 요소 의 캐리어 로 JFrame 을 혈액 Swing 구성 요 소 를 담 은 용기 로 볼 수 있 습 니 다.응용 프로그램 을 개발 할 때 자바.swing.JFrame 클래스 를 계승 하여 창 을 만 들 수 있 습 니 다.이 창 에 구성 요 소 를 추가 하고 구성 요소 에 이 벤트 를 설정 합 니 다.
이 창 은 JFrame 클래스 를 계승 하기 때문에'최대 화','최소 화','닫 기'등 단 추 를 가지 고 있 습 니 다.
자바 응용 프로그램 에서 JFrame 창 을 사용 하 는 방법 에 대해 자세히 설명 하 겠 습 니 다.
JFrame 프로그램의 문법 은 다음 과 같 습 니 다.
JFrame jf = new JFrame(title);
Container container = jf.getContentPane();
매개 변수의 의 미 는 다음 과 같다.
jf:JFrame 클래스 대상
container:Container 클래스 의 대상 은 JFrame 대상 이 getContentPane()방법 으로 가 져 올 수 있 습 니 다.
Swing 구성 요소 의 창 은 보통 구성 요소 와 용기 와 관련 이 있 기 때문에 JFrame 대상 생 성 이 완료 되면 getContentPane()방법 으로 창 을 용기 로 변환 한 다음 용기 에 구성 요 소 를 추가 하거나 레이아웃 관리 자 를 설정 해 야 합 니 다.
보통 이 용 기 는 구성 요 소 를 포함 하고 표시 하 는 데 사 용 됩 니 다.용기 에 구성 요 소 를 추가 하려 면 Container 류 의 add 방법 으로 설정 할 수 있 습 니 다.예 를 들 면:
container.add(새 단추("단추");
용기 에 구성 요 소 를 추가 한 후에 도 Container 류 의 reove()방법 으로 이 구성 요 소 를 용기 에서 삭제 할 수 있 습 니 다.예 를 들 어:
container.remove(new 단추);
다음 인 스 턴 스 는 JFrame 대상 이 창 을 만 들 고 구성 요 소 를 추가 하 는 것 을 실현 합 니 다.
package com.xsh;
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class Example1 extends JFrame { // JFrame
public void CreateJFrame(String title) { // CreateJFrame
JFrame jf = new JFrame(title); // JFrame
Container container = jf.getContentPane(); //
JLabel jl = new JLabel(" JFrame "); // JLabel
jl.setHorizontalAlignment(SwingConstants.CENTER); //
jl.setForeground(Color.white); // JLabel
container.add(jl); //
container.setBackground(Color.RED); //
jf.setVisible(true); //
jf.setSize(300, 150); //
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Example1().CreateJFrame(" JFrame 。"); // JFrame()
}
}
그 운행 결 과 는 다음 과 같다.상기 예 에서 Example 1 클래스 는 JFrame 클래스 를 계승 하고 CreateJFrame()방법 에서 JFrame 대상 을 실례 화 했다.JFrame 류 의 상용 구조 방법 은 다음 과 같은 두 가지 형식 을 포함한다.
public JFrame().
Public JFrame(String title).
JFrame 류 의 두 가지 구조 방법 은 무 삼 의 구조 방법 과 유 삼 의 구조 방법 이다.
첫 번 째 형식의 구조 방법 은 처음에 보이 지 않 고 제목 이 없 는 새 창 을 만 들 수 있다.
두 번 째 형식의 구조 방법 은 이 JFrame 대상 을 예화 할 때 보이 지 않 지만 제목 이 있 는 창 을 만 들 수 있 습 니 다.
JFrame 대상 이 show()방법 을 사용 하여 창 을 볼 수 있 지만 이 방법 은 계 정 된 JDK 의 setVisible(true)방법 으로 대체 되 었 습 니 다.
동시에 setSize(int i,int j)방법 으로 창 크기 를 설정 할 수 있 습 니 다.그 중에서 x 와 y 변 수 는 각각 창의 너비 와 높이 를 대표 합 니 다.
창 을 만 든 후 창 을 닫 는 방식 이 필요 합 니 다.setDefault CloseOPeration()방법 으로 창 을 닫 을 수 있 습 니 다.자바 는 창 을 닫 는 데 다양한 방식 을 제공 합 니 다.
자주 사용 하 는 것 은 다음 과 같은 네 가지 가 있다.
DO_NOTHING_ON_CLOSE
DISPOSE_ON_CLOSE)
HIDE_ON_CLOSE
EXIT_ON_CLOSE
JDialog
JDialog 창 은 Swing 구성 요소 의 대화 상자 로 AWT 구성 요소 의 java.awt.Dialog 클래스 를 계승 합 니 다.JDialog 창 은 IE 브 라 우 저 를 사용 할 때 나타 나 는 확인 대화 상자 처럼 다른 창 에서 다른 창 을 꺼 내 는 기능 을 합 니 다.JDialog 창 은 실질 적 으로 다른 유형의 창 입 니 다.JFrame 창 과 유사 합 니 다.사용 할 때 도 getCOntentPane()방법 으로 창 을 용기 로 변환 한 다음 용기 에 창의 특성 을 설정 해 야 합 니 다.
응용 프로그램 에서 JDialog 창 을 만 들 려 면 JDialog 류 를 예화 해 야 합 니 다.보통 다음 과 같은 JDialog 류 의 구조 방법 을 사용 합 니 다.
public JDialog():제목 과 부 창 이 없 는 대화 상 자 를 만 듭 니 다.
public JDialog(Frame f):부모 창 을 지정 하 는 대화 상 자 를 만 들 지만 대화 상 자 는 제목 이 없습니다.
public JDialog(Frame f,boolean model):지정 한 형식의 대화 상 자 를 만 들 고 부모 창 을 지정 하지만 이 창 은 제목 을 지정 하지 않 았 습 니 다.
public JDialog(Frame f,String title):지정 한 제목 과 부모 창 을 만 드 는 대화 상자
public JDialog(Frame f,String title,boolean model):지정 한 제목,부모 창,모드 대화 상 자 를 만 듭 니 다.
다음은 실례 를 보 겠 습 니 다.
package com.xsh;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
class MyDialog extends JDialog{
private static final long serialVersionUID = 1L;
public MyDialog(MyFrame frame) {
super(frame," JDialog ", true); // JDialog , 、
Container container = getContentPane(); //
container.add(new JLabel(" JDialog ")); //
setBounds(100, 100, 200, 100); // , ,
}
}
public class MyFrame extends JFrame { // , JFrame
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyFrame(); // MyFrame
}
public MyFrame() {
Container container = getContentPane(); //
container.setLayout(null);
JLabel jl = new JLabel(" JFrame "); //
jl.setHorizontalAlignment(SwingConstants.CENTER); //
container.add(jl); //
JButton jb = new JButton(" "); //
jb.setBounds(10, 30, 100, 20); //
jb.addActionListener(new ActionListener() { //
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
new MyDialog(MyFrame.this).setVisible(true); // MyDialog
// ,
}
});
container.add(jb);
container.setBackground(Color.white);
setSize(200,200);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setVisible(true);
}
}
이 인 스 턴 스 에 서 는 대화 상자 의 부모 창 을 팝 업 시 키 기 위해 JFrame 창 을 정의 합 니 다.먼저 이 창 에 단 추 를 정의 한 다음 이 단 추 를 누 르 면 이벤트 가 추 가 됩 니 다.클릭 이벤트 에서 우 리 는 new MyJDialog().setVisible(true)문 구 를 사용 하여 대화 상자 창 을 볼 수 있 도록 했 습 니 다.이렇게 하면 단일 컴퓨터 단 추 를 누 른 후에 대화 상 자 를 팝 업 하 는 기능 을 실현 할 수 있 습 니 다.MyDialog 류 에 서 는 JDialog 류 를 계승 하기 때문에 구조 방법 에서 슈퍼 키 워드 를 사용 하여 JDialog 구조 방법 을 호출 할 수 있 습 니 다.
여기 서 piublic JDialog(Frame f,String title,boolean model)를 사 용 했 습 니 다.이러한 형식의 구조 방법 은 사용자 정의 JFrame 창 과 대화 상자 의 제목 과 창 형식 을 설정 합 니 다.
이상 의 자바-JFrame 창 미화 방식 은 바로 소 편 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 에 게 참고 가 될 수 있 고 여러분 의 많은 사랑 을 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.