JavaSwing绘制杨辉三角形

今天收到一家公司面试题目,大致要求是:

1.用swing控件绘出杨辉三角形。(不能用edit之内的文本编辑控件)
要求:
a、测试在30行之内;
b、隔列对齐;
c、画出连线,连线要对齐,如附件图例中所示。
4、输出效果为等腰三角形的形状。
package com;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;

import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class TestYHComp {
	public static void main(String[] args) {
		JDialog d = new JDialog();
		JScrollPane sp = new JScrollPane();
		
		YangHuiTable ybTable = new YangHuiTable(IYangHuiModel.DEFAULT);
//		ybTable.setYHRow(IYangHuiModel.DEFAULT);//30
		sp.setViewportView(ybTable);
		
		d.setContentPane(sp);
//		d.pack();
		d.setSize(800, 600);
		d.setLocationRelativeTo(null);
		d.setVisible(true);
		
		Point p = new Point(ybTable.getPreferredSize().width/2-sp.getViewport().getWidth()/2, 0);
		sp.getViewport().setViewPosition(p);
	}

}

class YangHuiTable extends JTable {

	public YangHuiTable() {
		this(IYangHuiModel.DEFAULT);
	}

	public YangHuiTable(int row) {
		this(row, new YangHuiTableModel());
	}

	public YangHuiTable(int row, IYangHuiModel model) {
		super(model);
		this.setYHRow(row) ;
	}

	public void init() {
		this.initValue();
		this.setShowGrid(false);
		this.getColumnModel().setColumnMargin(0);
		this.getTableHeader().setReorderingAllowed(false);
		this.getTableHeader().setResizingAllowed(false);
		this.setAutoResizeMode(AUTO_RESIZE_OFF);
		this.setDefaultRenderer(Object.class, new YangHuiRenderer());
	}

	private void initValue() {
		IYangHuiModel model = ((IYangHuiModel) this.getModel());
		int row = model.getYHRow();
		int[][] a = initArray(row);
		for (int i = 0; i < row; i++) {
			for (int j = 0; j <= i; j++) {
				int r = i * 2 + 1 ;
				int c = row - i + j * 2 ;
				this.setValueAt(a[i][j], r, c);
				if( this.getValueAt(r + 1, c -1 ) != null ){
					this.setValueAt(Constants.RIGHT_BOTTON |Constants.BOTTON_LEFT , r + 1, c - 1) ;//3+4
				}else{
					this.setValueAt(Constants.RIGHT_BOTTON, r + 1, c - 1) ;
				}
				this.setValueAt(Constants.LEFT_TOP | Constants.TOP_RIGHT, r + 1, c ) ;
				this.setValueAt(Constants.BOTTON_LEFT, r + 1, c +1 ) ;
			}
		}

	}

	private int[][] initArray(int row) {
		int[][] a = new int[row][row];
		for (int i = 0; i < row; i++)
			for (int j = 0; j < row; j++) {
				if (j < i) {
					a[i][j] = 1;
					if (j == 0) {
						a[i][j] = 1;
					} else {
						a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
					}
				} else {
					a[i][j] = 1;
				}
			}
		return a;
	}

	@Override
	public boolean isCellEditable(int row, int column) {
		return false;
	}
	
	public void setYHRow(int rowInt){
		((IYangHuiModel) this.getModel()).setYHRow(rowInt);
		init() ;
	}
}

class YangHuiTableModel extends DefaultTableModel implements IYangHuiModel {

	protected int row;

	public YangHuiTableModel() {
		this(DEFAULT);
	}

	public YangHuiTableModel(int row ) {
		super(row * 2 + 1, row * 2 + 1);
		this.row = row;
	}

	public int getYHRow() {
		return row;
	}

	public void setYHRow(int row) {
		this.row = row;
		this.setRowCount(row * 2 + 1);
		this.setColumnCount(row * 2 + 1);
	}

}

class YangHuiRenderer extends DefaultTableCellRenderer {

	protected boolean isShowLine = false;
	
	private Object value ;
	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		this.value = value ;
		isShowLine = row % 2 == 0 && row + 1 != table.getRowCount();
		this.setHorizontalAlignment(JLabel.CENTER);

		return super.getTableCellRendererComponent(table, 
				isShowLine||row + 1 == table.getRowCount()?null:value, 
						isSelected,hasFocus, row, column);
	}

	private void paintLine(Graphics g){
		if ( isShowLine && value instanceof Integer){
			int lineInfo = (Integer)value ;
			if( (lineInfo | Constants.LEFT_TOP) == lineInfo){
				g.drawLine(0, getHeight()/2, getWidth()/2, 0);
			}
		    if( (lineInfo | Constants.TOP_RIGHT) == lineInfo){
		    	g.drawLine(getWidth()/2, 0, getWidth(), getHeight()/2);
		    }
			if( (lineInfo | Constants.RIGHT_BOTTON) == lineInfo){
				g.drawLine(getWidth(), getHeight()/2, getWidth()/2, getHeight());
			}
			if( (lineInfo | Constants.BOTTON_LEFT) == lineInfo){
				g.drawLine( getWidth()/2, getHeight(), 0, getHeight()/2);
			}
		}
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		if (isShowLine) {
			Graphics2D g2d=(Graphics2D)g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
            		RenderingHints.VALUE_ANTIALIAS_ON);
            paintLine(g) ;
		}
	}
}

interface IYangHuiModel extends TableModel ,Constants{

	public static final int DEFAULT = 30;
	
	public int getYHRow();

	public void setYHRow(int row);
}

interface Constants{
	
	public static final int LEFT_TOP = 0x00000001 ;
	
	public static final int TOP_RIGHT = LEFT_TOP << 1 ;
	
    public static final int RIGHT_BOTTON = LEFT_TOP << 2;
    
    public static final int BOTTON_LEFT = LEFT_TOP << 3 ;
}
 
大概测了测应该效果还可以,没细测。欢迎大家指出代码不对地方共同进步。 
运行效果:
  效果预览
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值