java swing自定义组件_JAVA Swing自定义JScorllPanel
JAVA Swing中JScrollPanle自定义带标尺的JScrollPanel
Swing中JScrollPanel的结构与组成如下图:
分为四个角与四个边,中间蓝色矩形为View窗口,可以通过调用JScrollPanel的
getViewport().setView(view)完成对现实内容的设置。
最常见的自定义JScrollPanel是改写默认的Column Header View与Row Header View
下面是我做的一个关于瓷砖排列显示的UI,实现了一个标尺化的JScrollPanel,可以很好
的度量与说明空间大小与瓷砖需求的关系,实现效果如下:
自定义的列与行标尺View的代码如下:
package com.gloomyfish.swing.custom.ui;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
public class RuleView extends JComponent {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final int HORIZONTAL = 0;
public static final int VERTICAL = 1;
private int SIZE = 600;
public int orientation;
public boolean isMetric;
private double increment;
private double units;
private int width;
private int height;
public RuleView(int o, boolean m) {
orientation = o;
isMetric = m;
setIncrementAndUnits();
if(orientation == HORIZONTAL)
{
width = SIZE;
}
else
{
height = SIZE;
}
}
private void setIncrementAndUnits() {
}
public void setPreferredHeight(int ph) {
this.height = ph;
setPreferredSize(new Dimension(SIZE, ph));
}
public void setPreferredWidth(int pw) {
this.width = pw;
setPreferredSize(new Dimension(pw, SIZE));
}
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
System.out.println("width = " + width);
System.out.println("Height = " + height);
// background color
g2d.setColor(new Color(102, 255, 255));
Rectangle2D rect2d = new Rectangle2D.Double(0, 0, width, height);
g2d.fill(rect2d);
int count = 0;
increment = 0;
// unit and text symbol
g2d.setPaint(new Color(0,0,204));
if(orientation == HORIZONTAL)
{
units = width / 10.0;
for(int i=0; i<=units; i++)
{
double rowOff = i * 10.0;
Line2D line = new Line2D.Double(rowOff, height*0.7, rowOff, height);
g2d.draw(line);
if(count == 10)
{
count = 0;
increment += 1;
Line2D bigLine = new Line2D.Double(rowOff, height*0.4, rowOff, height);
g2d.draw(bigLine);
g2d.drawString(increment + "", (int)rowOff-3, (int)(height/3.0));
}
count++;
}
}
else
{
units = height / 10.0;
for(int i=0; i<=units; i++)
{
double colOff = i * 10.0;
Line2D line = new Line2D.Double(width*0.7, colOff, width, colOff);
g2d.draw(line);
if(count == 10)
{
count = 0;
increment += 1;
Line2D bigLine = new Line2D.Double(width*0.5, colOff, width, colOff);
g2d.draw(bigLine);
g2d.drawString(increment + "", 0, (int)colOff);
}
count++;
}
}
g2d.setPaint(Color.RED);
}
}
自定义的JScrollPanel的代码如下:
package com.gloomyfish.swing.custom.ui;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.LineBorder;
public class JCustomScrollPane extends JScrollPane {
/**
*
*/
private static final long serialVersionUID = 1L;
private RuleView columnView;
private RuleView rowView;
private JLabel cornerLabel;
public JCustomScrollPane(int rowSize, int columnSize)
{
super();
JPanel buttonCorner = new JPanel(); // use FlowLayout
cornerLabel = new JLabel("单位:米");
cornerLabel.setForeground(Color.BLUE);
cornerLabel.setFont(new Font("Serif", Font.PLAIN, 8));
buttonCorner.setLayout(new FlowLayout(FlowLayout.LEFT));
buttonCorner.add(cornerLabel);
setCorner(JScrollPane.UPPER_LEFT_CORNER, buttonCorner);
columnView = new RuleView(RuleView.HORIZONTAL, true);
columnView.setPreferredHeight(30);
rowView = new RuleView(RuleView.VERTICAL, true);
rowView.setPreferredWidth(30);
setColumnHeaderView(columnView);
setRowHeaderView(rowView);
setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
setViewportBorder(new LineBorder(Color.RED));
}
public void setImagePanel(JComponent view)
{
this.getViewport().setView(view);
}
}
最后说一下,Swing 是非常灵活的UI组件,提供了非常多的自定义接口
怎么合理运用就看个人啦!
java swing自定义组件_JAVA Swing自定义JScorllPanel相关推荐
- java swing进度条_Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label ...
- java swing 控件_Java Swing组件
一. java swing 组件技术简介 1.swing的特性 l 是AWT的扩展,swing比AWT提供了更多的组件和外观 l 它是纯java代码编写(除了JFrame.JDial ...
- java中同步组件_Java并发编程(自定义同步组件)
并发包结构图: 编写一个自定义同步组件来加深对同步器的理解 业务要求: * 编写一个自定义同步组件来加深对同步器的理解. * 设计一个同步工具:该工具在同一时刻,只允许至多两个线程同时访问,超过两个线 ...
- java中复选框组件_Java Swing JCheckBox:复选框组件
一个复选框有选中和未选中两种状态,并且可以同时选定多个复选框.Swing中使用 JCheckBox 类实现复选框,该类的常用构造方法如下.JCheckBox():创建一个默认的复选框,在默认情况下既未 ...
- java flowlayout 左对齐_Java Swing组件布局管理器之FlowLayout(流式布局)入门教程
本文实例讲述了Java Swing组件布局管理器之FlowLayout(流式布局).分享给大家供大家参考,具体如下: FlowLayout应该是Swing布局管理器学习中最简单.最基础的一个.所谓流式 ...
- java窗口程序实例_Java Swing快速构建窗体应用程序
以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...
- java gui拖拽_Java Swing拖放
Java Swing教程 - Java Swing拖放 拖放(DnD)是一种在应用程序中传输数据的方法. DnD允许我们通过拖动组件并将其拖放到另一个组件上来传输数据. 拖动的组件称为拖动源;它提供要 ...
- java swing事件机制_java SWing事件调用的两种机制
/** * java swing中事件调用的两种机制: * (一)响应机制 * (二)回调机制 */ package test; import java.awt.*; import java.awt. ...
- java swing 知乎_java swing 界面开发
Swing界面开发 Swing体系组件:JFrame(窗体),JButton(按钮),JTree(树形结构)等 java中的界面类: java.awt包:颜色,布局,监听器等 javax.swing包 ...
最新文章
- ACL 2019 | 基于知识增强的语言表示模型,多项NLP任务表现超越BERT(附论文解读)...
- 牛客c语言数组,牛客网学习笔记 - C/C++
- 零基础python必背代码-30个Python常用极简代码,拿走就用
- Handle In-Day Changes
- 成功解决Ubuntu下的include/darknet.h:14:14: fatal error: cuda_runtime.h: No such file or directory
- stm32看门狗_「正点原子NANO STM32开发板资料连载」第十一章 独立看门狗实验
- Nginx负载均衡记录
- 第5章 Python 数字图像处理(DIP) - 图像复原与重建16 - 约束最小二乘方滤波、几何均值滤波
- 简易中控紫猫插件版(3)压缩包使用说明
- SpringBoot—JPA和JDBC常用配置说明
- 如何自定义类加载器?
- python FastDFS
- 预训练新范式!为什么Prompt会更有效?
- 2009年考研数学一解析pdf
- maya城市汽车流光效果插件car motion light 1.0.1下载及教程
- 单机 elasticsearch 7.12 索引状态yellow问题解决
- iText7高级教程之html2pdf——7.关于pdfHTML经常问的问题
- 多线程使用jxcell 解密xls文件,xlxs文件不支持.暴力破解6位数的Excel密码,jxcell下载
- VLN阶段性小结2023.1.10
- WP-南邮CTF逆向第六题 WxyVM2