如何判断一个组件是否可见?

How to determine if a component can be seen?

我有一个面板,在框架的中间有一堆标签。里面的一些标签在面板内部看不到它们的位置。

这里有一个更好看的表示(蓝色边框是面板;其中的绿色框是可见的标签,而红色的不是)

标签在这样的 for 循环中实例化...

for(int x = 0 ; x < 8 < x++){
  for(int y = 0; y < 11 < y++){
    Cell block = new Cell(); //Cell is a class that extends jlabel
    //code for setting block location here
    blockArray[x][y] = block;
    blockArray[x][y].setVisible(true);
    this.add(blockArray[x][y]);
  }
}

如何确定标签(在我的表示中)是绿色还是红色?因为我的目标是将绿色的设置为setVisible(true),而将红色的设置为setVisible(false)。

我尝试使用 isShowing 和 isDisplayable,但两者 returns 都为假,方法是用类似这样的内容替换 setVisible(boolean) 行...

if(block[x][y].isShowing()) block[x][y].setVisible(true);
else{block[x][y].setVisible(false)}

Cell 对象在其构造函数中有一个 setVisible(false),很确定它不会影响我的目标,因为我在实例化它们后将它们设置为 true,但我可能错了。

如果它们有标准尺寸,您可以计算出哪些标签可见,哪些不可见(如果您的框架是可调整大小的,您始终可以使用 JFrame.getSize() 获得它的尺寸。如果标签的尺寸因任何原因而变化原因,使用 JLabel.getSize() 和 JLabel.getLocation() 来计算标签是否显示在框架上。

总会有办法的。 事先知道,每次用户对您的 window 执行某些操作时,屏幕上每个可见组件的方法 paint() 都会被调用,我们可以使用此知识覆盖此方法并保存组件的状态。

    JPanel panel = new JPanel(){
        @Override
        public void paint(Graphics g){
            saveAndResetLabelsState();
            super.paint(g);
        }
    };
    JLabel label1 = new JLabel("first"){
        @Override
        public void paint(Graphics g){
            label1Visible = true;
            super.paint(g);
        }
    };
    JLabel label2 = new JLabel("second"){
        @Override
        public void paint(Graphics g){
            label2Visible = true;
            super.paint(g);
        }
    };
    //later on...
    private static void saveAndResetLabelsState()
    {
        label1SavedVisible = label1Visible;
        label2SavedVisible = label2Visible;
        label1Visible = false;
        label2Visible = false;
    }

SSSCE here