使用绘图API自定义组件

Posted siwuxie095

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用绘图API自定义组件相关的知识,希望对你有一定的参考价值。

-----------------siwuxie095

   

   

   

   

   

   

   

   

工程名:CustomizeSwing

包名:com.siwuxie095.swing

类名:MyFrame.java(主类)、MyPanel.java

   

   

工程结构目录如下:

   

   

   

   

   

MyFrame.java(主类):

   

package com.siwuxie095.swing;

   

import java.awt.Color;

import java.awt.Component;

import java.awt.EventQueue;

import java.awt.Point;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionAdapter;

   

import javax.swing.GroupLayout;

import javax.swing.GroupLayout.Alignment;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.LayoutStyle.ComponentPlacement;

import javax.swing.border.EmptyBorder;

   

public class MyFrame extends JFrame {

   

//将原本声明的 JPanel 注释掉,改为 MyPanel

//private JPanel contentPane;

private MyPanel contentPane;

 

//坐标:记录鼠标(mouse)的位置和窗体(JFrame)的位置

int mx,my,jfx,jfy;

//鼠标的初始位置

Point orgin=new Point();

   

/**

* Launch the application.

*/

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

public void run() {

try {

MyFrame frame = new MyFrame();

frame.setVisible(true);

} catch (Exception e) {

e.printStackTrace();

}

}

});

}

   

/**

* Create the frame.

*/

public MyFrame() {

 

// JFrame 添加鼠标按下和拖拽的事件:在窗体上按下鼠标可以拖拽窗体

//(如果给 contentPane 添加同样的事件是等效的)

//注意:(1)(2)是一组设置方法,(3)(4)是另一组设置方法

//(3)(4)要优于(1)(2)

addMouseListener(new MouseAdapter() {

@Override

public void mousePressed(MouseEvent e) {

 

// //(1)鼠标按下的瞬间在屏幕中的坐标值

// mx=e.getXOnScreen();

// my=e.getYOnScreen();

// //当前窗体的坐标值

// jfx=e.getX();

// jfy=e.getY();

 

 

//(3) 鼠标按下的时候在窗口的位置

orgin.x=e.getX();

orgin.y=e.getY();

 

}

});

 

 

addMouseMotionListener(new MouseMotionAdapter() {

@Override

public void mouseDragged(MouseEvent e) {

// //(2)在每一次移动鼠标时,对比移动后的坐标和移动前的坐标的差别

// //将这个差值加到窗体上即可,即鼠标移动多少,窗体就移动多少

// setLocation(jfx+(e.getXOnScreen()-mx), jfy+(e.getYOnScreen()-my));

 

 

//(4) 当鼠标拖动时获取窗口当前位置

Point p=getLocation();

// 窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置

setLocation(p.x+e.getX()-orgin.x, p.y+e.getY()-orgin.y);

}

});

 

 

// JFrame 添加 keyTyped 事件

//当点击 Esc Space 键时退出程序

addKeyListener(new KeyAdapter() {

 

@Override

public void keyTyped(KeyEvent e) {

if (e.getKeyCode()==0) {

System.exit(0);

}

}

 

});

 

 

//设定成不使用系统自带的窗体装饰

setUndecorated(true);

 

 

//将背景设定成全透明

//前三个是 rgb 值,最后一个是透明度

//透明度为 0,整个 JFrame 就完全透明了

//因为 JFrame contentPane 挡住了

//所以运行后"窗体"依然不透明,

//再去 MyPanel.java 中设置 contentPane 的透明度即可

setBackground(new Color(0,0,0,0));

 

 

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

 

 

//将原本的实例化方式注释掉,改为 MyPanel()

//contentPane = new JPanel();

contentPane = new MyPanel();

 

 

contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);

 

JPanel panel = new JPanel();

panel.setOpaque(false);

panel.setAlignmentX(Component.LEFT_ALIGNMENT);

 

 

 

//下面一大段代码由系统自动生成,不用管

GroupLayout gl_contentPane = new GroupLayout(contentPane);

gl_contentPane.setHorizontalGroup(

gl_contentPane.createParallelGroup(Alignment.LEADING)

.addComponent(panel, GroupLayout.DEFAULT_SIZE, 440, Short.MAX_VALUE)

);

gl_contentPane.setVerticalGroup(

gl_contentPane.createParallelGroup(Alignment.LEADING)

.addGroup(gl_contentPane.createSequentialGroup()

.addGap(25)

.addComponent(panel, GroupLayout.PREFERRED_SIZE, 264, GroupLayout.PREFERRED_SIZE)

.addContainerGap(29, Short.MAX_VALUE))

);

 

 

 

JButton btnExit = new JButton("Exit");

btnExit.setFocusable(false);

//添加鼠标点击事件

//当点击 Exit 按钮时退出程序

btnExit.addMouseListener(new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent e) {

System.exit(0);

}

});

 

 

JButton btnMax = new JButton("MAX");

btnMax.setFocusable(false);

btnMax.addMouseListener(new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent arg0) {

//向下还原:如果已经最大化,就还原成正常大小

if (getExtendedState()==JFrame.MAXIMIZED_BOTH) {

setExtendedState(JFrame.NORMAL);

}else {

//最大化:将JFrame设置成横向和纵向都最大化

setExtendedState(JFrame.MAXIMIZED_BOTH);

}

}

});

 

JButton btnMin = new JButton("MIN");

btnMin.setFocusable(false);

btnMin.addMouseListener(new MouseAdapter() {

@Override

public void mouseClicked(MouseEvent e) {

//最小化

setExtendedState(JFrame.ICONIFIED);

}

});

 

 

 

//下面一大段代码由系统自动生成,不用管

GroupLayout gl_panel = new GroupLayout(panel);

gl_panel.setHorizontalGroup(

gl_panel.createParallelGroup(Alignment.TRAILING)

.addGroup(gl_panel.createSequentialGroup()

.addContainerGap(217, Short.MAX_VALUE)

.addComponent(btnMin)

.addPreferredGap(ComponentPlacement.RELATED)

.addComponent(btnMax)

.addPreferredGap(ComponentPlacement.RELATED)

.addComponent(btnExit)

.addContainerGap())

);

gl_panel.setVerticalGroup(

gl_panel.createParallelGroup(Alignment.TRAILING)

.addGroup(Alignment.LEADING, gl_panel.createSequentialGroup()

.addContainerGap()

.addGroup(gl_panel.createParallelGroup(Alignment.BASELINE)

.addComponent(btnExit)

.addComponent(btnMax)

.addComponent(btnMin))

.addContainerGap(231, Short.MAX_VALUE))

);

panel.setLayout(gl_panel);

contentPane.setLayout(gl_contentPane);

}

}

   

   

   

MyPanel.java:

   

package com.siwuxie095.swing;

   

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.RenderingHints;

   

import javax.swing.JPanel;

   

//MyPanel 继承自 JPanel

public class MyPanel extends JPanel {

 

//需要复写父类 JPanel paintComponent() 方法

@Override

protected void paintComponent(Graphics g) {

 

//使用 Java2D,创建 Graphics2D 对象,让绘制效果更好

//需要强制类型转换

Graphics2D g2d=(Graphics2D) g;

 

 

//打开抗锯齿效果

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

 

 

//前三个是 rgb 值,最后一个是透明度

g2d.setColor(new Color(255,255,255,140));//白色,透明度为 140

 

 

以上是关于使用绘图API自定义组件的主要内容,如果未能解决你的问题,请参考以下文章

Java AWT 图形界面编程Canvas 组件中使用 Graphics 绘图 ② ( AWT 绘图步骤 | Graphics 绘图常用 API )

如何使用 Vue 组合 API 导入其他自定义组件?

自定义控件

pyqt5——自定义控件

Nuxt 中的组件自定义选项与 Vue 3 组合 API

使用 Swagger 的扩展组件Plugin 机制自定义API文档的生成

(c)2006-2024 SYSTEM All Rights Reserved IT常识