swing204自定义控件

Swing 自定义控件学习笔记 做一个用Swing开发的小工具,需要用到一个可拉伸的矩形控件,学习了下极客学院的自定义控件的视频教程记录一下~^_^ 自定义控件主要实现Jcomponent中的4个方法来绘制控件: paintComponent(Graphics)  绘制组件自身paintBorder(Graphics)  绘制组件border边框paintChildren(Graphics) 绘制该控件内部的子控件p 阅读详情

自定义控件

在这里插入图片描述

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);  // 右半圆弧
		outline.closePath();
		g2d.setPaint(lineColor);
		g2d.draw(outline);
		g2d.setPaint(bgColor);
		g2d.fill(outline);

		// 内部画两个圆
		if(selected)
		{
			drawCircleInside(g2d, r2, padding, lineColor, lightColor);
		}
		else
		{
			drawCircleInside(g2d, r1, padding, lineColor, darkColor);
		}
	}

	// 画内部的小圆
	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);

		toggle.setStateListener( new AfToggleButton.StateListener() {

			@Override
			public void stateChanged(Object source)
			{
				System.out.println("haha...");
			}
		});
	}


}

package my;


import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
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 AfToggleButton()
	{
		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{
				onMouseClicked();
			}
		});
	}

	private void onMouseClicked()
	{
		toggle(); // 点击时切换状态

		// 自定义接口
		if(stateListener != null)
		{
			stateListener.stateChanged(this);
		}
	}

	public interface StateListener // 内部类/接口
	{
		void stateChanged(Object source);
	}

	private StateListener stateListener; // 属性

	public void setStateListener(StateListener listener)
	{
		this.stateListener = listener;
	}

	// 获取数据
	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);  // 右半圆弧
		outline.closePath();
		g2d.setPaint(lineColor);
		g2d.draw(outline);
		g2d.setPaint(bgColor);
		g2d.fill(outline);

		// 内部画两个圆
		if(selected)
		{
			drawCircleInside(g2d, r2, padding, lineColor, lightColor);
		}
		else
		{
			drawCircleInside(g2d, r1, padding, lineColor, darkColor);
		}
	}

	// 画内部的小圆
	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 );
	}
}

开关选项设置(练习)

在这里插入图片描述

package my;


import javax.swing.*;

public class Swing2
{
	private static void createGUI()
	{
		// JFrame指一个窗口,构造方法的参数为窗口标题
		// 语法:因为MyFrame是JFrame的子类,所以可以这么写
		JFrame frame = new MyFrame("Swing Demo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		// 设置窗口的其他参数,如窗口大小
		frame.setSize(500, 300);
		
		// 显示窗口
		frame.setVisible(true);
		
		
	}
	
	public static void main(String[] args)
	{
		// 此段代码间接地调用了 createGUI(),具体原理在 Swing高级篇 里讲解
		// 初学者先照抄此代码框架即可
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run()
			{
				createGUI();
			}
		});

	}
}
package my;


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

public class MyFrame extends JFrame
{
	AfToggleButton toggle1 = new AfToggleButton();
	AfToggleButton toggle2 = new AfToggleButton();
	AfToggleButton toggle3 = new AfToggleButton();

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

		// Content Pane
		AfPanel root = new AfPanel();
		this.setContentPane(root);
		root.setLayout( new AfColumnLayout(10));
		root.padding(10);

		//
		if(true)
		{
			AfPanel row = new AfPanel();
			root.add(row, "30px");

			row.setLayout(new AfRowLayout(10));
			row.add(new JLabel("流量监控"), "1w");
			row.add(toggle1, "100px");
		}

		if(true)
		{
			AfPanel row = new AfPanel();
			root.add(row, "30px");

			row.setLayout(new AfRowLayout(10));
			row.add(new JLabel("音量键上下翻页"), "1w");
			row.add(toggle2, "100px");
		}

		if(true)
		{
			AfPanel row = new AfPanel();
			root.add(row, "30px");

			row.setLayout(new AfRowLayout(10));
			row.add(new JLabel("退出前确认"), "1w");
			row.add(toggle3, "100px");
		}
	}


}
package my;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.util.Calendar;

import javax.swing.JPanel;


public class MyPanel extends JPanel
{

    public MyPanel()
    {
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        int width = getWidth();
        int height = getHeight();
        Graphics2D g2d = (Graphics2D) g;

        // 平滑绘制 ( 反锯齿 )
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setPaint(Color.WHITE);
        g2d.fillRect(0, 0, width, height);

        int x = 0,y = 0;
        int x_size = 40; // 单元格宽度
        int y_size = 40; // 单元格高度

        // 第一行:一、二、三、四、五、六、日
        g2d.setPaint( Color.GRAY);
        g2d.drawLine(x,y, x + x_size*7, y );
        g2d.drawLine(x,y+y_size, x + x_size*7, y + y_size);
        String[] cc = {"一", "二", "三", "四", "五", "六", "日" };

        g2d.setPaint( Color.GRAY);
        g2d.setFont(new Font("宋体", 0,20));
        for(int i=0; i<7; i++)
        {
            Rectangle rect = new Rectangle(x+ i*x_size , y, x_size, y_size);
            drawText(g2d, cc[i], rect);
        }

        // 计算本月第一天是星期几
        Calendar cal = Calendar.getInstance();
        int theMonth = cal.get(Calendar.MONTH); // 当前是几月
        int theDay = cal.get(Calendar.DAY_OF_MONTH); // 当前是几号
        cal.set(Calendar.DAY_OF_MONTH, 1);// 向前推到本月第一天
        int weekday = cal.get(Calendar.DAY_OF_WEEK); // 计算本月第一天是周几
        System.out.println("week:" + weekday);

        // 往前推N天
        // Calendar里规定Sunday=1(周日), Monday=2, ..., Saturday=7(周六)
        // 它是周一,则前推0天,周二,推1天,周六,推5天,周日,推6天

        int start = weekday - Calendar.MONDAY;
        if(start <0) start = 6;
        cal.add(Calendar.DAY_OF_MONTH,  0 - start); // 前推,从上月开始显示

        // 绘制五行
        // 每月最多31天,可分五行显示
        x = 0;
        y += y_size;
        for(int i=0; i<5; i++) // 5行
        {
            for(int j=0; j<7; j++) // 7列
            {
                // 判断月份是否相同
                if(cal.get(Calendar.MONTH) == theMonth)
                {
                    g2d.setPaint(Color.BLACK);
                }
                else
                {
                    g2d.setPaint(Color.GRAY);
                }
                int day = cal.get(Calendar.DAY_OF_MONTH);
                Rectangle rect = new Rectangle(x+x_size*j, y+y_size*i, x_size, y_size);
                drawText(g2d, String.valueOf(day), rect);

                // 日期 +1
                cal.add(Calendar.DAY_OF_MONTH, 1);
            }
        }

    }

    // 将str绘制在矩形rect中,居中显示
    private void drawText(Graphics2D g2d, String str, Rectangle rect)
    {
        FontMetrics fm = g2d.getFontMetrics(g2d.getFont());
        int fontSize = fm.getHeight(); // 字高
        int textWidth = fm.stringWidth(str);
        int leading = fm.getLeading();
        int ascent = fm.getAscent(); // top -> baseline 的高度
        int descent = fm.getDescent(); // bottom->baseline 的高度
        // System.out.println(fontSize + "," + leading + "," + ascent + "," + descent);

        int x = 0, y = 0;
        x = rect.x + (rect.width - textWidth)/2; // 水平居中
        y = rect.y + rect.height /2 + (fontSize-leading)/2 - descent; // 竖直居中
        g2d.drawString(str, x, y);
    }
}
package my;

import java.awt.Dimension;
import java.awt.LayoutManager;

import javax.swing.JPanel;

import af.swing.border.AfBorder;

/* Swing入门篇 7.5 节 */

public class AfPanel extends JPanel
{
	public AfPanel layout( LayoutManager manager)
	{
		this.setLayout(manager);
		return this;
	}
	
	///////////// padding /////////////
	public AfPanel padding( int size)
	{
		return padding(size, size, size, size);
	}
	
	public AfPanel padding( int top, int left, int bottom, int right)
	{
		AfBorder.addPadding(this, top,left, bottom,right);
		return this;
	}

	////////////// margin ////////////////
	public AfPanel margin( int size)
	{
		return margin(size, size, size, size);
	}
	
	public AfPanel margin( int top, int left, int bottom, int right)
	{
		AfBorder.addMargin(this, top,left, bottom,right);
		return this;
	}
	
	//////////// max size ///////////
	public AfPanel maxSize(int w, int h)
	{
		this.setMaximumSize(new Dimension(w, h));
		return this;
	}
	
	public AfPanel maxWidth(int w)
	{
		Dimension size = this.getMaximumSize();
		if(size == null)
			size = new Dimension(0,0);
		size.width = w;
		this.setMaximumSize( size);
		return this;
	}
	
	public AfPanel maxHeight(int h)
	{
		Dimension size = this.getMaximumSize();
		if(size == null)
			size = new Dimension(0,0);
		size.height = h;
		this.setMaximumSize( size);
		return this;
	}
	
	//////////// perferred size ///////////
	public AfPanel preferredSize(int w, int h)
	{
		this.setPreferredSize(new Dimension(w, h));
		return this;
	}
	
	public AfPanel preferredWidth(int w)
	{
		Dimension size = this.getPreferredSize();
		if(size == null)
			size = new Dimension(0,0);
		size.width = w;
		this.setPreferredSize( size);
		return this;
	}
	
	public AfPanel preferredHeight(int h)
	{
		Dimension size = this.getPreferredSize();
		if(size == null)
			size = new Dimension(0,0);
		size.height = h;
		this.setPreferredSize( size);
		return this;
	}

	//////////// min size ///////////
	public AfPanel minSize(int w, int h)
	{
		this.setMinimumSize(new Dimension(w, h));
		return this;
	}
	
	public AfPanel minWidth(int w)
	{
		Dimension size = this.getMinimumSize();
		if(size == null)
			size = new Dimension(0,0);
		size.width = w;
		this.setMinimumSize( size);
		return this;
	}
	
	public AfPanel minHeight(int h)
	{
		Dimension size = this.getMinimumSize();
		if(size == null)
			size = new Dimension(0,0);
		size.height = h;
		this.setMinimumSize( size);
		return this;
	}
	
}
package my;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.LayoutManager2;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.JPanel;

/* Swing入门篇 7.4节  ( 并在 7.5 节最终优化 )*/ 

public class AfRowLayout implements LayoutManager2
{
	private List<Item> items = new ArrayList<>();
	private int gap = 2;
	private boolean usePerferredSize = false; // 竖立方向是否占满
	
	public AfRowLayout()
	{		
	}
	public AfRowLayout(int gap)
	{		
		this.gap = gap; // 控件之间的间距
	}
	public AfRowLayout(int gap, boolean usePerferredSize)
	{	
		this.gap = gap;
		this.usePerferredSize = usePerferredSize;
	}
		
	@Override
	public void addLayoutComponent(String name, Component comp)
	{
		Item item = new Item();
		item.comp = comp;
		item.constraints = "auto";
		items.add(item);
	}

	@Override
	public void removeLayoutComponent(Component comp)
	{
		Iterator<Item> iter = items.iterator();
		while(iter.hasNext())
		{
			Item item = iter.next();
			if(item.comp == comp)
			{
				iter.remove();
			}
		}
	}

	@Override
	public void addLayoutComponent(Component comp, Object constraints)
	{
		Item item = new Item();
		item.comp = comp;
		item.constraints = (String) constraints;
		items.add(item);
	}
	
	@Override
	public Dimension preferredLayoutSize(Container parent)
	{
		return new Dimension(30,30);
	}

	@Override
	public Dimension minimumLayoutSize(Container parent)
	{
		return new Dimension(30,30);
	}

	@Override
	public Dimension maximumLayoutSize(Container target)
	{
		return new Dimension(30,30);
	}

	
	@Override
	public void layoutContainer(Container parent)
	{
		// 得到内矩形
		Rectangle rect = new Rectangle(parent.getWidth(), parent.getHeight());
		//Rectangle rect = parent.getBounds();
		Insets insets = parent.getInsets();
		rect.x += insets.left;
		rect.y += insets.top;
		rect.width -= (insets.left + insets.right);
		rect.height -= (insets.top + insets.bottom);
		
		// 第一轮:过滤到无效的 Item ( 有些控件是隐藏的 )
		List<Item> validItems = new ArrayList<>();
		for(Item it: items )
		{
			if(it.comp.isVisible())
				validItems.add(it);
		}
		
		// 第二轮处理:百分比,像素,auto的,直接计算出结果; 权重的,在第三轮计算
		int totalGapSize = gap * (validItems.size() - 1);// 间距大小
		int validSize = rect.width - totalGapSize;
		int totalSize = 0;
		int totalWeight = 0;
		for(Item it : validItems)
		{
			Dimension preferred = it.comp.getPreferredSize();
			it.width = preferred.width;
			it.height = usePerferredSize ? preferred.height : rect.height;
			it.weight = 0;
			
			// 计算宽度
			String cstr = it.constraints;
			if( cstr == null || cstr.length() == 0)
			{
				//System.out.println("(AfRowLayout) Warn: Must define constraints when added to container!");
			}
			else if( cstr.equals("auto"))
			{
			}
			else if(cstr.endsWith("%")) // 按百分比
			{
				int num = Integer.valueOf(cstr.substring(0,cstr.length()-1));
				it.width = validSize * num / 100;
			}
			else if(cstr.endsWith("w")) // 按权重
			{
				int num = Integer.valueOf(cstr.substring(0,cstr.length()-1));
				it.width = 0;
				it.weight = num;
			}
			else if(cstr.endsWith("px")) // 按权重
			{
				int num = Integer.valueOf(cstr.substring(0,cstr.length()-2));
				it.width = num;
			}
			else // 按像素
			{
				int num = Integer.valueOf(cstr);
				it.width = num;
			}
			
			totalSize += it.width;
			totalWeight += it.weight;
			
			//System.out.println("计算值:width=" + it.width + ",weight=" + it.weight);
		}
		
		// 第三轮: 剩余空间按权重分配
		if( totalWeight > 0)
		{
			int remainSize = validSize - totalSize;
			double unit = (double) remainSize / totalWeight;
			for(Item it : validItems)
			{
				if(it.weight > 0)
				{
					it.width = (int)( unit * it.weight );
				}
			}			
		}

		//System.out.println("总宽度: " + rect.width);
		
		// 第四轮: 按宽度和高度布局
		int x = 0;
		for(Item it : validItems)
		{
			int y = (rect.height - it.height)/2;
			if(x + it.width > rect.width)
				it.width = rect.width - x;
			if(it.width <= 0) break;
			
			it.comp.setBounds(rect.x + x, rect.y + y, it.width, it.height);
			
			//System.out.println("宽度: " + it.width);
			x += it.width;
			x += gap; // 间距
		}
	}

	@Override
	public float getLayoutAlignmentX(Container target)
	{
		return 0;
	}

	@Override
	public float getLayoutAlignmentY(Container target)
	{
		return 0;
	}

	@Override
	public void invalidateLayout(Container target)
	{
		
	}

	///////////////////////
	private static class Item
	{
		Component comp;
		String constraints = "auto";
		int width = 0;
		int height = 0;
		int weight = 0;  // 权重
	}
	

}

package my;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.LayoutManager2;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.JPanel;

/* Swing入门篇 7.5 节 */

/* ChangeLog
 * 2019-01-23: 修改bug, int validSize = rect.height ..里的width变成height
 */

public class AfColumnLayout implements LayoutManager2
{
	private List<Item> items = new ArrayList<>();
	private int gap = 2;
	private boolean usePerferredSize = false; // 竖立方向是否占满
	
	public AfColumnLayout()
	{		
	}
	public AfColumnLayout(int gap)
	{		
		this.gap = gap; // 控件之间的间距
	}
	public AfColumnLayout(int gap, boolean usePerferredSize)
	{	
		this.gap = gap;
		this.usePerferredSize = usePerferredSize;
	}
		
	@Override
	public void addLayoutComponent(String name, Component comp)
	{
		Item item = new Item();
		item.comp = comp;
		item.constraints = "auto";
		items.add(item);
	}

	@Override
	public void removeLayoutComponent(Component comp)
	{
		Iterator<Item> iter = items.iterator();
		while(iter.hasNext())
		{
			Item item = iter.next();
			if(item.comp == comp)
			{
				iter.remove();
			}
		}
	}

	@Override
	public void addLayoutComponent(Component comp, Object constraints)
	{
		Item item = new Item();
		item.comp = comp;
		item.constraints = (String) constraints;
		items.add(item);
	}
	
	@Override
	public Dimension preferredLayoutSize(Container parent)
	{
		return new Dimension(30,30);
	}

	@Override
	public Dimension minimumLayoutSize(Container parent)
	{
		return new Dimension(30,30);
	}

	@Override
	public Dimension maximumLayoutSize(Container target)
	{
		return new Dimension(30,30);
	}

	
	@Override
	public void layoutContainer(Container parent)
	{
		// 得到内矩形
		Rectangle rect = new Rectangle(parent.getWidth(), parent.getHeight());
		//Rectangle rect = parent.getBounds();
		Insets insets = parent.getInsets();
		rect.x += insets.left;
		rect.y += insets.top;
		rect.width -= (insets.left + insets.right);
		rect.height -= (insets.top + insets.bottom);
		
		// 第一轮:过滤到无效的 Item ( 有些控件是隐藏的 )
		List<Item> validItems = new ArrayList<>();
		for(Item it: items )
		{
			if(it.comp.isVisible())
				validItems.add(it);
		}
		
		// 第二轮处理:百分比,像素,auto的,直接计算出结果; 权重的,在第三轮计算
		int totalGapSize = gap * (validItems.size() - 1);// 间距大小
		int validSize = rect.height - totalGapSize;
		int totalSize = 0;
		int totalWeight = 0;
		for(Item it : validItems)
		{
			Dimension preferred = it.comp.getPreferredSize();
			it.width = usePerferredSize ? preferred.width : rect.width;
			it.height = preferred.height;
			it.weight = 0;
			
			// 计算宽度
			String cstr = it.constraints;
			if( cstr == null || cstr.length() == 0)
			{
				//System.out.println("(AfColumnLayout) Warn: Must define constraints when added to container!");
			}
			else if( cstr.equals("auto"))
			{
			}
			else if(cstr.endsWith("%")) // 按百分比
			{
				int num = Integer.valueOf(cstr.substring(0,cstr.length()-1));
				it.height = validSize * num / 100;
			}
			else if(cstr.endsWith("w")) // 按权重
			{
				int num = Integer.valueOf(cstr.substring(0,cstr.length()-1));
				it.height = 0;
				it.weight = num;
			}
			else if(cstr.endsWith("px")) // 按权重
			{
				int num = Integer.valueOf(cstr.substring(0,cstr.length()-2));
				it.height = num;
			}
			else // 按像素
			{
				int num = Integer.valueOf(cstr);
				it.height = num;
			}
			
			totalSize += it.height;
			totalWeight += it.weight;
			
			//System.out.println("计算值:width=" + it.width + ",weight=" + it.weight);
		}
		
		// 第三轮: 剩余空间按权重分配
		if( totalWeight > 0)
		{
			int remainSize = validSize - totalSize;
			double unit = (double) remainSize / totalWeight;
			for(Item it : validItems)
			{
				if(it.weight > 0)
				{
					it.height = (int)( unit * it.weight );
				}
			}			
		}

		//System.out.println("总宽度: " + rect.width);
		
		// 第四轮: 按宽度和高度布局
		int y = 0;
		for(Item it : validItems)
		{
			int x = 0; // 水平靠左			
			if(y + it.height > rect.height)
				it.height = rect.height - y;
			if(it.height <= 0) break;
			
			it.comp.setBounds(rect.x + x, rect.y + y, it.width, it.height);
			
			//System.out.println("宽度: " + it.width);
			y += it.height;
			y += gap; // 间距
		}
	}

	@Override
	public float getLayoutAlignmentX(Container target)
	{
		return 0;
	}

	@Override
	public float getLayoutAlignmentY(Container target)
	{
		return 0;
	}

	@Override
	public void invalidateLayout(Container target)
	{
		
	}

	///////////////////////
	private static class Item
	{
		Component comp;
		String constraints = "auto";
		int width = 0;
		int height = 0;
		int weight = 0;  // 权重
	}
	

}

package my;


import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
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 AfToggleButton()
	{
		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{
				onMouseClicked();
			}
		});
	}

	private void onMouseClicked()
	{
		toggle(); // 点击时切换状态

		// 自定义接口
		if(stateListener != null)
		{
			stateListener.stateChanged(this);
		}
	}

	public interface StateListener // 内部类/接口
	{
		void stateChanged(Object source);
	}

	private StateListener stateListener; // 属性

	public void setStateListener(StateListener listener)
	{
		this.stateListener = listener;
	}

	// 获取数据
	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);  // 右半圆弧
		outline.closePath();
		g2d.setPaint(lineColor);
		g2d.draw(outline);
		g2d.setPaint(bgColor);
		g2d.fill(outline);

		// 内部画两个圆
		if(selected)
		{
			drawCircleInside(g2d, r2, padding, lineColor, lightColor);
		}
		else
		{
			drawCircleInside(g2d, r1, padding, lineColor, darkColor);
		}
	}

	// 画内部的小圆
	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 );
	}
}

自定义事件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package my;


import javax.swing.*;

public class Swing2
{
	private static void createGUI()
	{
		// JFrame指一个窗口,构造方法的参数为窗口标题
		// 语法:因为MyFrame是JFrame的子类,所以可以这么写
		JFrame frame = new MyFrame("Swing Demo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
		// 设置窗口的其他参数,如窗口大小
		frame.setSize(500, 300);
		
		// 显示窗口
		frame.setVisible(true);
		
		
	}
	
	public static void main(String[] args)
	{
		// 此段代码间接地调用了 createGUI(),具体原理在 Swing高级篇 里讲解
		// 初学者先照抄此代码框架即可
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run()
			{
				createGUI();
			}
		});

	}
}

package my;


import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyFrame extends JFrame
{
	JTextField textField = new JTextField(20);
	JButton okButton = new JButton("OK");
	ToggleButton toggleButton = new ToggleButton();
	
	public MyFrame(String title)
	{
		super(title);

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

		root.add(textField);
		root.add(okButton);

		// 第一种写法: MouseEvent
//		okButton.addMouseListener(new MouseAdapter() {
//			@Override
//			public void mouseClicked(MouseEvent e)
//			{
//				textField.setText("2019-02-14");
//			}			
//		});
		
		// 第二种写法:ActionEvent
		okButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e)
			{
				textField.setText("2019-02-14 5555");
			}
		});
		
		// 这也是ActionEvent
		textField.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e)
			{
				System.out.println("在文本框里输入了回车!");
			}
		});
		
		//////////////////////////////
		// 自定义事件
		root.add(toggleButton);
		toggleButton.setPreferredSize(new Dimension(60,30));
		toggleButton.setStateListener(new ToggleButton.StateListener() {
			@Override
			public void stateChanged(StateEvent e)
			{
				System.out.println("当前选中状态为:" + e.state);
			}
		});
	}

	
}
package my;

import java.awt.AWTEvent;

/* 模仿ActionEvent,自写一个事件对象
 * 仅作为演示用途
 */
public class StateEvent extends AWTEvent
{
	public boolean state;
	
	public StateEvent(Object source, int id)
	{
		super(source, id);
	}
}
package my;


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

public class ToggleButton 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 ToggleButton()
	{
		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e)
			{
				onMouseClicked();
			}			
		});
	}
	
	private void onMouseClicked()
	{
		toggle(); // 点击时切换状态
		
		// 自定义接口
		if(stateListener != null)
		{
			// 使用自定义事件
			StateEvent event = new StateEvent(this, 0);
			event.state = this.selected;
			stateListener.stateChanged(event);
		}
	}

	public interface StateListener // 内部类/接口
	{
		void stateChanged(StateEvent e);
	}
	
	private StateListener stateListener; // 属性
	
	public void setStateListener(StateListener listener)
	{
		this.stateListener = listener;
	}

	// 获取数据
	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);  // 右半圆弧
		outline.closePath();
		g2d.setPaint(lineColor);
		g2d.draw(outline);
		g2d.setPaint(bgColor);
		g2d.fill(outline);
		
		// 内部画两个圆
		if(selected)
		{
			drawCircleInside(g2d, r2, padding, lineColor, lightColor);
		}
		else
		{
			drawCircleInside(g2d, r1, padding, lineColor, darkColor);
		}
	}
	
	// 画内部的小圆
	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 );
	}
}
基于JavaSwing+Mysql的仓库销售管理系统 一般的零售业销售必须是快速而且不允许出错的,如果能在销售前尽早地了解目前商品的库存情况,并且掌握商品的周转率,就可以减少销售中的供过于求或供不应求等情况的发生。进入用户管理,系统将根据当前用户id回写用户信息(隐藏密码),且密码不允许修改,点击修改按钮,弹出用户验证窗口,要求输入当前用户原始密码,用户确定,系统验证密码的合法性,若密码非法,则返回对应错误提示信息,返回用户管理主页,若密码合法,则允许用户修改信息,当用户提交修改时,系统验证输入的合法性,返回对应的提示信息,修改成功则要求用户重新登录。 阅读详情

相关推荐

Java Swing自定义观感(仅以自定义treeUI为例)

Java Swing自定义观感的一个小例子(仅以自定义treeUI为例)。仅仅举例如何实现java SWing自定义观感,并不完整,童鞋可以根据treeUI编写其他控件的UI。

Swing-自定义控件(开关绘制)

设计思路: 1、开关按钮绘制 原理: 对绘制的图像面板添加鼠标点击事件,每点击一次,切换一次显示状态 2、布局(自定义布局...........) MyFrame: package Swing0501; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayou...

给你更好的 2484

从开通VPS到搭建宝塔面板全教程

你在输入域名(此时我们可能没有类似aaa.com这样的域名,所以要输入VPS的IP地址)的时候,下面的根目录也会跟着变动,等输入完成后,你可以把根目录再改回成/www/wwwroot/dq。这时,在你的浏览器中,输入外网面板地址的URL,输入username和password,即可登陆宝塔面板。第一次登陆,需要绑定你的宝塔账号,你可以到宝塔的注册界面,用手机注册一个,然后绑定,首先看一下你的VPS操作系统是什么类型的(其实你在选择VPS的时候,就已经选定了,我选择的事Centos系统)。

kxltsuperr的专栏 3736

java swing自定义控件_Swing自定义组件: SwitchButton

packageswing;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.GradientPaint;importjava.awt.Graphics;importjava.awt.Graphics2D;importjava.awt.Paint;importjava.aw...

weixin_30600615的博客 415

FPGA 核脉冲梯形成型 Verilog 实现:从 MATLAB 到 50MHz 采样率部署

本文详细解析了FPGA实现核脉冲梯形成型的完整流程,从MATLAB仿真到50MHz采样率的Verilog硬件部署。重点探讨了梯形成型算法对负指数信号的优化处理,包括定点数量化、流水线架构设计及资源优化技巧,为核辐射探测与高能物理实验提供高效解决方案。

weixin_30920513的博客 391

快速入门:使用 SQL Server Management Studio (SSMS) 连接和查询 SQL Server 实例

开始使用 SQL Server Management Studio (SSMS) 连接到 SQL Server 实例并运行一些 Transact-SQL (T-SQL) 命令。本文介绍如何连接和查询实例SQL Server。有关 Azure SQL,请参阅连接。若要使用,请参阅连接和查询。若要详细了解如何SQL Server Management Studio,请参阅其他。......

m0_72938729的博客 5729

swing自定义组件集合

/绘制参数设定//主背景色//描边//灰色填充//高亮填充//轮廓线与内部圆的距离// 开关, ON/OFF//添加鼠标事件@Override});@Override//绘制//平滑绘制(反锯齿)// 算出一个2:1的最大矩形h = height;//里面两个并排圆, 外层轮廓为曲线//左半区//右半区//绘制外部轮廓线//外轮廓,使用拼装路径// 右半圆弧//选择绘制的按钮} else {/**

zp的博客 1万+

STM32串口接收避坑指南:为什么你的USART_IT_IDLE中断不触发?附完整调试流程

本文深入解析STM32串口接收中断机制,特别是USART_IT_IDLE中断不触发的常见原因及解决方案。通过详细分析中断标志清除顺序、波特率配置、硬件连接等关键因素,并提供完整的调试流程和代码示例,帮助开发者快速定位并解决串口通信问题。

weixin_42519985的博客 348

java动态添加组件_有关Java Swing动态增加组件

展开全部效果图参考代码importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;//本类继承自JFrame实现了ActionListener接口publicclassDemoFrame1extendsJFrameimplementsActionListener{JPaneljpc;//存放组件的面板JScr...

weixin_39838829的博客 1985

Ribo测序翻译效率计算及可视化

本文介绍了一个计算翻译效率(TE)和分析转录-翻译相关性的生物信息学流程。首先通过Python脚本从标准化表达量矩阵(TPM/FPKM)计算TE值,该脚本自动匹配转录组(RNA)和翻译组(Ribo)样本进行比值运算。然后使用R语言进行相关性分析,通过ggplot2绘制样本间转录-翻译表达量的散点图,添加线性回归线和相关系数标注,支持PNG/PDF格式输出。整个流程实现了从原始数据处理到可视化分析的全过程。

Tiaoxiaobai的博客 554

信息安全管理与评估赛题解析-单机取证(含环境)

链接:https://pan.baidu.com/s/1OMzIq884dW2vAiUp0k2Ppg。链接:https://pan.baidu.com/s/1i5daMqhD53wYeQ6hYzRK6Q。链接:https://pan.baidu.com/s/1QFAjdQZK4sJ-gGRP42XPKA。链接:https://pan.baidu.com/s/1BSXvqN2ZGCQXewgFULoeyQ。链接:https://pan.baidu.com/s/1g9zu5ngBz_KMjW1eBMkJAw。

Brucye 1835

基于SWING的日期选择控件

这段时间由于公司需要,在做C/S的东西,自然考虑优先用SWING实现,自然遇到了日期选择控件的问题,在网上GOOGLE了,发现了一个不错的控件,故转载之. 参考界面如下://DatePicker.javapackage com.kxsoft.component;//修改import java.awt.*;import java.awt.event.*;import java.uti

heroying的专栏 4439

logisim中,如何设计一个位于十字路口的交通信号灯控制系统?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1347

java 日历控件_java swing 日历控件怎么实现 最好是源码

展开全部源代码:e69da5e887aa3231313335323631343130323136353331333330363864//DatePicker.javapackagecom.kxsoft.component;importjava.awt.*;importjava.awt.event.*;importjava.util.GregorianCalendar;importjava...

weixin_30095015的博客 313

微调实操一: 增量预训练(Pretraining)

《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代码比较难以理解,而且模型只能从hugging face上下载,对于一些国内服务器无法访问,我重构了代码,让训练代码更有可读性,并参考LLAMAFactory的项目,增加了modelscope上下载模型,轻松在国内服务器运行.

youbingchen的博客 6993

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

改写的基于SWING的日期选择控件

上次公司需要,搞了一个SWING的Aapplication的DEMO,重新弄了一般SWING,可惜最后无疾而终,可悲.....    最近离职,把以前的东西整理了一下,觉得多少有点用处,写下算是悼念吧!    这是其中日期选择控件的代码,改编自网上某个程序(记不得了),界面如下所示:     源代码:    //DatePicker.java    package com.kxsoft.compo

JAVA|J2EE|J2ME|JDK|JSP 1134

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Swing日期时间选择框控件

最近做一个Swing软件,其中要用到日期时间选择器(DateChooser),但是Swing中没有现成的日期时间选择器可用,于是在网上搜索了一下,找了一个比较靠谱的例子,因为任务比较紧,所以没有时间细致地美化,自己修改了几处,增加了一些注释,增加了几个功能(如:增加了确定、取消按钮;添加了取消时JButton的Text恢复选择前的日期时间;增加了得到当前日期时间格式化器等),现在放出来,欢迎有时间

fh09102103的专栏 8196

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java平方运算swing_利用java的swing控件实现四则混合运算计算器

其中ExperDemo2这个类在之前的文章里面写过,就不再粘贴一遍了package expr;import java.awt.Color;import java.awt.EventQueue;import java.awt.Font;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;impor...

weixin_28968525的博客 242

Swing2_b站

第4章开始P16第4章 标签 JLabel1、复制SwingDemoP174.2 文本框 JTextFieldP184.3 复选框 JCheckBoxP194.4 下拉列表 JComboBox P16第4章 标签 JLabel 1、复制SwingDemo package Swing0401; import javax.swing.*; public class SwingDemo { private static void createGUI() { // JFra

qq_42788016的博客 278

利用java的swing控件实现四则混合运算计算器

java swing控件实现四则混合运算的计算器

Scorpion_CG的博客 2139

JAVA Swing GUI设计 WindowBuilder Pro Container使用大全6——JLayeredPane使用

1、废话不多说,看效果2、代码:package UI; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing....

BOBO的博客 844

WinForm"不错的Vista风格水晶按钮"控件使用(附:源码demo) 之配餐系统的开发

做WinForm开发的朋友,应该都有这种感觉:vs自带的控件倒是不少,但美观的却很少 ——于是网上就有一些开源、收费或免费的不错的控件,像皮肤等控件库DotNetBar、饼状图控件pieChart(此控件的使用,可查看之前的一篇文章:WinForm"立体饼状图实现(附源码示例)" 之配餐系统的开发)....,(在之前的几篇介绍配餐系统开发的文章里,我主要是对一些功能...

weixin_34146986的博客 126

java addactionlistener使用_Java JPasswordField.addActionListener方法代码示例

import javax.swing.JPasswordField; //导入方法依赖的package包/类public PasswordManagerRegistration(PasswordManagerGUI gui) {this.gui = gui;regpanel = new JPanel();regpanel.setLayout(new BorderLayout(0, 0));JPan...

weixin_33506900的博客 875

Java初学之华容道游戏

1 package hhuarongdao; 2 3 public class example { 4 public static void main(String args[]) 5 { 6 new Hua_Rong_Road(); 7 } 8 } 1 package hhuarongdao; 2 import java.awt.*; ...

weixin_34288121的博客 396

黑马程序员_GUI

------ android培训、java培训、java学习型技术博客、期待与您交流! ----------           图形化界面 1 概念:     GUI是Graphical User Interface的缩写,图形用户接口     CLI是Command line User Interface的缩写 ,命令行用户接口,就是常见的Dos命令行操作。需要记忆

u010503207的专栏 680
上一篇: swing203不规则形状绘制
下一篇: swing205图表
dingpython
博客等级 码龄6年 5粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值