2015-11-30 29 views
0

给我的任务是直观地举例说明一个使用java的算法:我必须模拟堆结构。确保涂漆的字符串不会离开可见区域?

预期布局。

The expected layout

我现在面临的问题是如何确保在代码区画字符串不离开可见区域漠然的屏幕分辨率。我已经确保JFrame具有屏幕大小 - 任务栏大小。该面板被最大化,isResizable属性为false。

所以,我怎么能确保该字符串不离开可见区域?

我想绘制的代码: 如果代码更长(Y维度),那么容器的关注点就是X Dimension,这并不重要。

我试着一行一行的打印。

public class heap<T> 
{ 
    private ArrayList<T> h; 
    private int size; 
    private final Comparator<T> c; 

    public heap(Comparator<T> comparator) 
    { 
     h = new ArrayList<T>(); 
     h.add(null); 
     size = 0; 
     this.c = comparator; 
    } 

    public T getMin() 
    { 
     return h.get(1); 
    } 

    public T popMin() 
    { 
     T tmp = getMin(); 
     h.set(1, h.get(size)); 
     size--; 
     sift(1); 
     return tmp; 
    } 

    public void insert(T key) 
    { 
     h.add(key); 
     percolate(++size); 
    } 

    public int getSize() 
    { 
     return this.size; 
    } 

    private int getLeftSon(int i) 
    { 
     return (i<<1<=size)? i<<1 : 0; 
    } 

    private int getRightSon(int i) 
    { 
     return ((i<<1)+1<=size)? (i<<1)+1 : 0; 
    } 

    private int getFather(int i) 
    { 
     return ((i>>1)!=0)? i>>1 : 0; 
    } 

    private void swap(int i, int j) 
    { 
     T tmp = h.get(i); 
     h.set(i, h.get(j)); 
     h.set(j, tmp); 
    } 

    private void sift(int i) 
    { 
     int son; 
     do { 
      son = 0; 
      if (getLeftSon(i) != 0) 
      { 
       son = getLeftSon(i); 
       if (getRightSon(i) != 0 && c.compare(h.get(getRightSon(i)), h.get(getLeftSon(i))) > 0) 
        son = getRightSon(i); 
       if (c.compare(h.get(son), h.get(i)) <= 0) 
        son = 0; 
      } 

      if (son!=0) { 
       swap(i, son); 
       i = son; 
      } 
     } while (son!=0); 
    } 

    private void percolate(int i) 
    { 
     T key = h.get(i); 

     while ((i > 1) && (c.compare(key, h.get(getFather(i))) > 0)) 
     { 
      h.set(i, h.get(getFather(i))); 
      i = getFather(i); 
     } 

     h.set(i, key); 
    } 
} 
+0

你可以发布一些代码 – Ryan

+1

请给我们一个[可运行示例](http://stackoverflow.com/help/MCVE)与到目前为止你已经尝试...... – Frakcool

+1

*什么“确保一个画线不离开可见区域?” *我通常打开'String'成'Shape'或'Area'之前画。然后很容易获得形状的边界框的高度和宽度并缩放其需要的大小。 –

回答

2

您的代码区域是相当窄的,在单声道空间12点字体呈现25个字符的数量级。

这里有一个方法,如果一个字符串将适合在一个给定的像素宽度:

public boolean doesStringFit(int width, String s, Font font) { 
     FontRenderContext frc = new FontRenderContext(null, true, true); 
     Rectangle2D r2D = font.getStringBounds(s, frc); 
     int rWidth = (int) Math.round(r2D.getWidth()); 
     int rX = (int) Math.round(r2D.getX()); 
     return width >= (rWidth - rX); 
    }