首页 > java > Swing > > 正文

JAVA Swing自定义JScorllPanel

发布人:zhoulujun@live.cn    点击:

JAVA Swing中JScrollPanle自定义带标尺的JScrollPanelSwing中JScrollPanel的结构与组成如下图:分为四个角与四个边,中间蓝色矩形为View窗

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);
	}
	
}