JAVA Swing自定义JScorllPanel

简介: 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的代码如下:

1.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组件,提供了非常多的自定义接口

怎么合理运用就看个人啦!

相关文章
|
5天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
5天前
|
Java
在 Java 中,如何自定义`NumberFormatException`异常
在Java中,自定义`NumberFormatException`异常可以通过继承`IllegalArgumentException`类并重写其构造方法来实现。自定义异常类可以添加额外的错误信息或行为,以便更精确地处理特定的数字格式转换错误。
|
1月前
|
Java
让星星⭐月亮告诉你,自定义定时器和Java自带原生定时器
定时器是一种可以设置多个具有不同执行时间和间隔的任务的工具。本文介绍了定时器的基本概念、如何自定义实现一个定时器,以及Java原生定时器的使用方法,包括定义定时任务接口、实现任务、定义任务处理线程和使用Java的`Timer`与`TimerTask`类来管理和执行定时任务。
47 3
|
21天前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
43 14
|
28天前
|
安全 Java
如何在 Java 中创建自定义安全管理器
在Java中创建自定义安全管理器需要继承SecurityManager类并重写其方法,以实现特定的安全策略。通过设置系统安全属性来启用自定义安全管理器,从而控制应用程序的访问权限和安全行为。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
58 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
1月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
44 3
|
2月前
|
IDE Java 开发工具
java自定义异常20
java自定义异常20
28 3
|
2月前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
20 0