1

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

/*
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类的想法与臭名昭著的while(true)做一些像重新调整组件大小这样平凡的事情让我很兴奋(NOT),但我必须找到某种替代方案。所以这让我回到了问题的根源。什么是倾听和触发对容器尺寸变化的响应的正确方法?如果没有正确的方法,你有哪些轻量级、可管理和合理的实践?

我已经能够忽略这一点将近半年了,当我接近我的程序完成时,这是我非常想摆脱的东西。请伸出援助之手:)

4

1 回答 1

1

好吧,MadProgrammer向我指出了这一点ComponentListener。虽然需要一些时间,但效果很好,完全符合我的要求。我知道这个问题让很多人感到困惑,所以我会比大多数教程更详细一些,并解释集成 ComponentListener 以调整窗口大小的几个简单步骤。

第一步:导入正确的库

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

第二步:在你的类中实现监听器

public class Plotter extends GCanvas implements ComponentListener{

第三步:添加你ObjectComponentListener

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
}

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

于 2013-09-25T12:48:31.913 回答