今天收到一家公司面试题目,大致要求是:
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 ;
}
大概测了测应该效果还可以,没细测。欢迎大家指出代码不对地方共同进步。
运行效果: