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相关推荐

  1. java swing进度条_Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)

    本文将讲解如何做一个类似MyEclipse启动画面的闪屏,为Java Swing应用程序增添魅力. 首先看一下效果图吧, 原理很简单,就是创建一个Dialog,Dialog有一个进度条和一个Label ...

  2. java swing 控件_Java Swing组件

    一.        java swing 组件技术简介 1.swing的特性 l  是AWT的扩展,swing比AWT提供了更多的组件和外观 l  它是纯java代码编写(除了JFrame.JDial ...

  3. java中同步组件_Java并发编程(自定义同步组件)

    并发包结构图: 编写一个自定义同步组件来加深对同步器的理解 业务要求: * 编写一个自定义同步组件来加深对同步器的理解. * 设计一个同步工具:该工具在同一时刻,只允许至多两个线程同时访问,超过两个线 ...

  4. java中复选框组件_Java Swing JCheckBox:复选框组件

    一个复选框有选中和未选中两种状态,并且可以同时选定多个复选框.Swing中使用 JCheckBox 类实现复选框,该类的常用构造方法如下.JCheckBox():创建一个默认的复选框,在默认情况下既未 ...

  5. java flowlayout 左对齐_Java Swing组件布局管理器之FlowLayout(流式布局)入门教程

    本文实例讲述了Java Swing组件布局管理器之FlowLayout(流式布局).分享给大家供大家参考,具体如下: FlowLayout应该是Swing布局管理器学习中最简单.最基础的一个.所谓流式 ...

  6. java窗口程序实例_Java Swing快速构建窗体应用程序

    以前接触java感觉其在桌面开发上,总是不太方便,没有一个好的拖拽界面布局工具,可以快速构建窗体. 最近学习了一下NetBeans IDE 8.1,感觉其窗体设计工具还是很不错的 , 就尝试一下做了一 ...

  7. java gui拖拽_Java Swing拖放

    Java Swing教程 - Java Swing拖放 拖放(DnD)是一种在应用程序中传输数据的方法. DnD允许我们通过拖动组件并将其拖放到另一个组件上来传输数据. 拖动的组件称为拖动源;它提供要 ...

  8. java swing事件机制_java SWing事件调用的两种机制

    /** * java swing中事件调用的两种机制: * (一)响应机制 * (二)回调机制 */ package test; import java.awt.*; import java.awt. ...

  9. java swing 知乎_java swing 界面开发

    Swing界面开发 Swing体系组件:JFrame(窗体),JButton(按钮),JTree(树形结构)等 java中的界面类: java.awt包:颜色,布局,监听器等 javax.swing包 ...

最新文章

  1. ACL 2019 | 基于知识增强的语言表示模型,多项NLP任务表现超越BERT(附论文解读)...
  2. 牛客c语言数组,牛客网学习笔记 - C/C++
  3. 零基础python必背代码-30个Python常用极简代码,拿走就用
  4. Handle In-Day Changes
  5. 成功解决Ubuntu下的include/darknet.h:14:14: fatal error: cuda_runtime.h: No such file or directory
  6. stm32看门狗_「正点原子NANO STM32开发板资料连载」第十一章 独立看门狗实验
  7. Nginx负载均衡记录
  8. 第5章 Python 数字图像处理(DIP) - 图像复原与重建16 - 约束最小二乘方滤波、几何均值滤波
  9. 简易中控紫猫插件版(3)压缩包使用说明
  10. SpringBoot—JPA和JDBC常用配置说明
  11. 如何自定义类加载器?
  12. python FastDFS
  13. 预训练新范式!为什么Prompt会更有效?
  14. 2009年考研数学一解析pdf
  15. maya城市汽车流光效果插件car motion light 1.0.1下载及教程
  16. 单机 elasticsearch 7.12 索引状态yellow问题解决
  17. iText7高级教程之html2pdf——7.关于pdfHTML经常问的问题
  18. 多线程使用jxcell 解密xls文件,xlxs文件不支持.暴力破解6位数的Excel密码,jxcell下载
  19. VLN阶段性小结2023.1.10
  20. WP-南邮CTF逆向第六题 WxyVM2

热门文章

  1. CSS3-web字体
  2. iptables转发mysql_CentOS系统中使用iptables设置端口转发
  3. Delta机器人运动学算法编译中遇到的问题
  4. markdown 表格样式设置(跨行表格,背景色等)
  5. 2020年中国研究生数学建模竞赛C题——面向康复工程的脑电信号分析和判别模型
  6. anaconda pycharm_python入门必备干货 | python,pycharm,anaconda区别与联系
  7. Linux vim与vi 的使用详细
  8. c语言设计模式代码完整实现-状态机模式
  9. 猜数字游戏-学员版本
  10. Emoji表情对照码地址