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

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

相关文章
|
1天前
|
Java 数据安全/隐私保护
利用Java图形化界面组件Swing写一个简易的登录界面
利用Java图形化界面组件Swing写一个简易的登录界面
13 1
|
4天前
|
前端开发 Java
【技术进阶】Java高手都在用的秘籍:自定义异常,让错误信息说话!
【6月更文挑战第19天】在Java中,自定义异常提升代码可读性和可维护性,提供针对特定错误的定制反馈。创建自定义异常涉及继承`Exception`类,如`CustomException`,并用它来抛出具有详细信息的错误。在实践中,可以为异常添加额外字段,如`DetailedException`的`errorCode`,以增强信息携带能力。使用自定义异常时,应明确目的、保持简洁、提供丰富信息并统一风格,使其成为高效错误处理的工具。
|
4天前
|
Java 程序员 开发者
【程序员必修课】那些年,我们踩过的Java坑:自定义异常,让你的代码不再“捉急”!
【6月更文挑战第19天】Java异常处理不仅是错误处理,更是程序健壮性的体现。自定义异常能提供更精确的错误信息,便于问题定位。通过继承`Exception`创建自定义异常类,如`NegativeValueException`,可使代码更优雅,降低维护难度。自定义异常还能携带额外信息,如错误代码,增强企业级应用的错误处理能力。善用自定义异常,提升代码质量和开发效率,是优秀编程实践的重要组成部分。
|
4天前
|
搜索推荐 Java 开发者
【实战指南】Java异常处理新高度:自定义异常,打造个性化的错误管理体系!
【6月更文挑战第19天】在Java中,自定义异常允许开发人员针对特定业务需求创建新的异常类型,增强代码可读性和维护性,特别是在大型项目中。它使错误处理更精确,避免通用异常的模糊性,提升程序稳定性。创建自定义异常需继承`Exception`或`RuntimeException`,提供有意义的构造函数,并注意序列化ID。使用时,通过`throw`抛出并在`try-catch`块中捕获。设计上,异常命名应明确,携带相关信息,避免过度使用,且保持一致性。自定义异常是构建健壮错误处理体系的关键。
|
8天前
|
Java Windows
基于java Swing编写扫雷游戏设计实现(已调试)
基于java Swing编写扫雷游戏设计实现(已调试)
16 1
|
11天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(七十一)-java+ selenium自动化测试-自定义类解决元素同步问题(详解教程)
【6月更文挑战第12天】本文介绍了如何创建一个自定义类库来解决自动化测试中的元素同步问题。作者指出,大部分错误源于元素因时间不同步而引发,为此提供了一种解决方案。在项目实践中,首先在`library`包下创建名为`MyWait`的类,包含一个方法`isElementPresent`,该方法通过循环尝试并等待指定元素出现,避免了直接使用时间等待可能导致的不准确性。之后,在测试类中调用此自定义方法,成功实现了元素同步。代码示例展示了如何在Java+Selenium自动化测试中应用这个自定义类。
31 2
|
4天前
|
Java 编译器
Java自定义测试框架测试对象中相应的成员方法
Java自定义测试框架测试对象中相应的成员方法
10 0
|
8天前
|
存储 设计模式 前端开发
[笔记] 疯狂JAVA讲义(第3版)第12章 Swing编程
[笔记] 疯狂JAVA讲义(第3版)第12章 Swing编程
|
9月前
|
Java 数据安全/隐私保护
Java自定义类加载器的编写步骤
Java自定义类加载器的编写步骤
49 0
|
11月前
|
Java 数据库 数据安全/隐私保护
【Java面试】谈谈你对自定义类加载器的理解
【Java面试】谈谈你对自定义类加载器的理解
106 0