swing204自定义控件

自定义控件package my;import javax.swing.*;public class Swing2 { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createGUI();
摘要由CSDN通过智能技术生成

自定义控件

在这里插入图片描述

package my;

import javax.swing.*;

public class Swing2 {
   
    public static void main(String[] args) {
   
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
   
            @Override
            public void run() {
   
                createGUI();
            }
        });
    }

    private static void createGUI() {
   
//        System.out.println( System.getProperty("java.class.path"));
        JFrame frame = new MyFrame("Swing Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 300);
        frame.setVisible(true);

    }
}
package my;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.geom.Point2D;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class MyFrame extends JFrame
{
   

    public MyFrame(String title)
    {
   
        super(title);

        // Content Pane
        JPanel root = new JPanel();
        this.setContentPane(root);
        root.setLayout(new FlowLayout());

        JCheckBox checkbox = new JCheckBox("喜欢");
        root.add(checkbox);

        JComboBox<String> combo = new JComboBox<>();
        combo.addItem("红");
        combo.addItem("绿");
        combo.addItem("蓝");
        root.add(combo);


        checkbox.setPreferredSize(new Dimension(100,30));
        combo.setPreferredSize(new Dimension(100,30));
    }


}

ToggleButton显示

在这里插入图片描述

package my;


import javax.swing.*;
import java.awt.*;

public class MyFrame extends JFrame
{
   

	public MyFrame(String title)
	{
   
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new FlowLayout());

		JLabel label = new JLabel("流量监控");
		AfToggleButton toggle = new AfToggleButton();
		root.add(label);
		root.add(toggle);
		
		toggle.setPreferredSize(new Dimension(180, 100));
		
	}

	
}

package my;


import javax.swing.*;
import java.awt.*;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;

public class AfToggleButton extends JPanel
{
   
	// 绘制参数设定
	public Color bgColor = new Color(0xFFFFFF); // 主背景
	public Color lineColor = new Color(0xDEDEDE); // 描边
	public Color darkColor = new Color(0xE1E1E1); // 灰色填充
	public Color lightColor = new Color(0x33B4FF); // 高亮填充
	public int padding = 2; // 轮廓线与内部圆的距离
	
	@Override
	protected void paintComponent(Graphics g)
	{
   
		super.paintComponent(g);
		
		int width = getWidth();
		int height = getHeight();
		Graphics2D g2d = (Graphics2D) g;

		// 平滑绘制 ( 反锯齿 )
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		
		// 算出一个2:1的最大矩形	
		// Rectangle r = new Rectangle(0,0, 100, 50);
		int w = width;
		int h = width / 2;
		if( h > height)
		{
   
			h = height;
			w = height * 2;
		}
		Rectangle r = new Rectangle((width-w)/2, (height-h)/2, w, h);
		
		// 里面两个并排的圆,外层轮郭为拼接曲线(不规则形状的绘制:参考4.3讲)	
		// 左半区
		Rectangle r1 = new Rectangle(r.x,r.y, r.width/2, r.height);
		// 右半区
		Rectangle r2 = new Rectangle(r.x+r.width/2,r.y, r.width/2, r.height);
			
		// 绘制外部轮廓线
		Shape arc1 = new Arc2D.Double (r1, 90, 180, Arc2D.OPEN);
		Shape arc2 = new Arc2D.Double (r2, 270, 180, Arc2D.OPEN);		
		
		Path2D outline = new Path2D.Double(); // 外轮廓,使用拼装路径
		outline.append(arc1.getPathIterator(null), false); // 左半圆弧
		outline.append(arc2.getPathIterator(null), true);  // 右半圆弧
		outline.closePath();
		g2d.setPaint(lineColor);
		g2d.draw(outline);
		g2d.setPaint(bgColor);
		g2d.fill(outline);
		
		// 内部画两个圆
		drawCircleInside(g2d, r1, padding, lineColor, darkColor);
		drawCircleInside(g2d, r2, padding, lineColor, lightColor);
	}
	
	// 画内部的小圆
	private void drawCircleInside(Graphics2D g2d, Rectangle rect, 
			int deflate, Paint lineColor, Paint fillColor)
	{
   
		Rectangle r = new Rectangle(rect); // 做一个备份,不会修改传入的rect
		r.x += deflate;
		r.y += deflate;
		r.width -= (deflate * 2);
		r.height -= (deflate* 2);

		Shape shape = new Ellipse2D.Double(r.x, r.y, r.width,r.height);

		// 描边
		g2d.setPaint(lineColor);
		g2d.draw(shape);
		// 填充
		g2d.setPaint(fillColor);
		g2d.fill( shape );
	}
}

ToggleButton数据

在这里插入图片描述

package my;


import javax.swing.*;
import java.awt.*;

public class MyFrame extends JFrame
{
   

	public MyFrame(String title)
	{
   
		super(title);

		// Content Pane
		JPanel root = new JPanel();
		this.setContentPane(root);
		root.setLayout(new FlowLayout());

		JLabel label = new JLabel("流量监控");
		AfToggleButton toggle = new AfToggleButton();
		root.add(label);
		root.add(toggle);
		
		toggle.setPreferredSize(new Dimension(180, 100));

		toggle.setSelected(true);
	}

	
}

package my;


import javax.swing.*;
import java.awt.*;
import java.awt.geom.Arc2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;

public class AfToggleButton extends JPanel
{
   
	private boolean selected = true; // 开关, ON/OFF

	// 绘制参数设定
	public Color bgColor = new Color(0xFFFFFF); // 主背景
	public Color lineColor = new Color(0xDEDEDE); // 描边
	public Color darkColor = new Color(0xE1E1E1); // 灰色填充
	public Color lightColor = new Color(0x33B4FF); // 高亮填充
	public int padding = 2; // 轮廓线与内部圆的距离

	// 获取数据
	public boolean isSelected()
	{
   
		return this.selected;
	}
	// 设置数据
	public void setSelected(boolean selected)
	{
   
		this.selected = selected;
		repaint();
	}
	// 切换开关
	public void toggle()
	{
   
		this.selected = ! this.selected;
		repaint();
	}

	@Override
	protected void paintComponent(Graphics g)
	{
   
		super.paintComponent(g);

		int width = getWidth();
		int height = getHeight();
		Graphics2D g2d = (Graphics2D) g;

		// 平滑绘制 ( 反锯齿 )
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

		// 算出一个2:1的最大矩形
		// Rectangle r = new Rectangle(0,0, 100, 50);
		int w = width;
		int h = width / 2;
		if( h > height)
		{
   
			h = height;
			w = height * 2;
		}
		Rectangle r = new Rectangle((width-w)/2, (height-h)/2, w, h);

		// 里面两个并排的圆,外层轮郭为拼接曲线(不规则形状的绘制:参考4.3讲)
		// 左半区
		Rectangle r1 = new Rectangle(r.x,r.y, r.width/2, r.height);
		// 右半区
		Rectangle r2 = new Rectangle(r.x+r.width/2,r.y, r.width/2, r.height);

		// 绘制外部轮廓线
		Shape arc1 = new Arc2D.Double (r1, 90, 180, Arc2D.OPEN);
		Shape arc2 = new Arc2D.Double (r2, 270, 180, Arc2D.OPEN);

		Path2D outline = new Path2D.Double(); // 外轮廓,使用拼装路径
		outline.append(arc1.getPathIterator(null), false); // 左半圆弧
		outline.append(arc2.getPathIterator(null), true);  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值