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 ; }
大概测了测应该效果还可以,没细测。欢迎大家指出代码不对地方共同进步。
运行效果: