(用三角形式显示数字) 编写程序,将数字显示成三角形式,改变窗口大小时,为了适应窗口,行数将会随窗口的大小而变化。
import javax.swing.*;
import java.awt.Color;
import java.awt.Graphics;
public class ShowTriangleNumber extends JFrame {
/**
 * 定义一个面板类,添加到框架中
 */
public ShowTriangleNumber(){
   add(new Npanel());
}
public static void main(String[] args){
ShowTriangleNumber frame = new ShowTriangleNumber();
frame.setTitle("show a chessboard");  
frame.setSize(640,450);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); }
}
class Npanel extends JPanel{
protected void paintComponent(Graphics g){
super.paintComponent(g);
for(int i=1;i < getHeight()/30;i++){
for(int j=1;j <= i;j++){
/*为了显示成一个三角形,每行需要控制行的Y轴坐标不变,为了填满空间,
*X轴的行进距离(getWidth()/(getHeight()/30))*j
*/
g.drawString(String.valueOf(j),(getWidth()/(getHeight()/30))*j, 30*i);
}
}
}
}
这一题开始做的时候想的复杂了,*行数将会随窗口的大小而变化* 这个要求我以为需要通过重绘方法repaint(),从这个角度想,不知道如何实现,后来先不管这个条件,程序先写出来,运行后发现,上面的要求已经实现了。这里还是有点问题:程序运行起来后,我调整窗口大小,源代码中并没有定义这样的方法,*行数将会随窗口的大小而变化*这个条件是怎么实现的呢?
JavaStringGraphics

解决方案 »

  1.   

    for(int i=1;i < getHeight()/30;i++){
    这句决定了当前可以显示多少行,窗口大小变化后,getHeight()的值就变了
      

  2.   

    按理说应该会有一个更改大小的监听函数  可是好像没发现对swing不是很懂
      

  3.   

    getHeight()的值会改变,但是我每调整一次窗口,这个程序就会重新运行一次吗?如果没有重新运行,那Graphics函数是怎么感知到并且重新绘制图形的呢?这个是我不理解的地方,能解释下吗?
      

  4.   

    每当调整一次窗口就自动执行一次repaint(),此时getheight()的值已经改变了。所以就实现效果了。楼主可以重写一下repaint()比如 @Override
    public void repaint(long arg0, int arg1, int arg2, int arg3, int arg4) {

    super.repaint(arg0, arg1, arg2, arg3, arg4);
    System.out.println(90);
    }你就会发现,刷新一次就有一次输出,所以重绘是自动执行的
      

  5.   

    g.drawString(String.valueOf(j),(getWidth()/(getHeight()/30))*j, 30*i);
    这里的getWidth()和getHeight()是取得当前窗口的宽和高,当你改变了窗口的大小,这里也同时会得到窗口宽,高的新值。
      

  6.   

    窗口大小改变后,会触发相应的事件ComponentResized,从而导致getWidth()和getHeight()