确定画布何时调整大小的最佳做法是什么?

时间:2013-09-25 10:55:14

标签: java awt

好的,所以我一直在研究图形计算器很长一段时间,在项目的早期我实现了一个有点强大的窗口监听器。或者我应该说我构建了一个健壮的窗口侦听器来处理窗口大小更改时更新局部变量。我基本上做的就是这个...

/*
canvas, canvasWidth, canvasHeight and refreshGrid() are all local to this class
*/
private class resizeCatch extends Thread{
    private boolean refreshOnStop = false;
    public void run(){
        while(true){
            if(canvasWidth != canvas.getWidth() || canvasHeight != canvas.getHeight()){
                canvasWidth = canvas.getWidth();
                canvasHeight = canvas.getHeight();
                refreshOnStop = true;
            }else if(refreshOnStop && canvasWidth == canvas.getWidth() && canvasHeight == canvas.getHeight()){
                refreshOnStop = false;
                refreshGrid();
            }
            try{Thread.sleep(100);} catch(InterruptedException e) {}
        }
    }
}

当我的Thread对象被实例化时,我启动此Plotter,它所做的就是检查画布的大小并将其与内部变量进行比较。如果存在差异,则更新变量,触发更新以及差异何时停止更新事物的图形方面并继续监听更改。

我知道这是一种常见做法。

然而,我一直在推广我的Plotter窗口,我已经使它更易于部署,并且它不一定必须再管理它自己的窗口了,这就是为什么我觉得是时候把这个讨厌了眼睛疼痛到路边!然而,我仍然有什么时候刷新图形的问题...显而易见的答案是当画布改变大小但我怎么知道?

理想情况下隐藏在手册中的某些地方(哦,相信我,我已经在最近几个月彻底阅读了这些手册...... )有某种WindowEventListener或ContainerListener有一个ResizeEvent或者一些我不熟悉的口语行话。但是我找不到任何东西!

虽然在我的程序中嵌入了无关的Thread类的想法与臭名昭着的同时(真实)做了一些肮脏的工作,因为重新调整组件的东西会刺激我(< strong> NOT )我必须找到某种替代方案。所以这种方式让我回到了问题的根源。什么是正确的方式来监听和触发对容器更改的维度的响应?如果没有正确的方法您将哪些实践放在一起,这些实践是轻量级的,可管理的和合理的?

我已经能够忽略这一近半年了,当我接近我的程序结束时,这是我迫切希望摆脱的东西。请伸出援助之手:)

1 个答案:

答案 0 :(得分:1)

好吧,如此巨大的帽子提示MadProgrammer向我指出ComponentListener。虽然花了一些时间完美地完成了我想要的。我知道这个问题困扰了很多人,所以我会比大多数教程更冗长,并解释了集成ComponentListener以调整窗口大小的几个简单步骤。

第一步:导入正确的库

import java.awt.event.ComponentListener;
import java.awt.event.ComponentEvent;

第二步:为您的班级实施听众

public class Plotter extends GCanvas implements ComponentListener{

第三步:将Object添加到ComponentListener

this.addComponentListener(this);

第四步:覆盖以下方法

public void componentResized(ComponentEvent e){
    //do whatever you want upon size change
}

public void componentHidden(ComponentEvent e){
    //do whatever you want upon visibility change
}

public void componentMoved(ComponentEvent e){
    //do whatever you want upon location change
}

public void componentShown(ComponentEvent e){
    //do whatever you want upon visibility change
}

几乎就是这样。一旦这些工具到位,您就可以开展业务了!享受:)