如何确定是否可以看到组件?

时间:2015-11-14 12:29:04

标签: java swing jlabel jcomponent

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

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

enter image description here 标签在这样的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,但两者都返回false,通过用这样的东西替换setVisible(boolean)行...

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

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

2 个答案:

答案 0 :(得分:1)

如果它们具有标准尺寸,您可以计算哪些标签是可见的,哪些不可见(如果您的框架可以调整大小,您可以随时使用JFrame.getSize()获取其尺寸。如果标签因尺寸不同而出于任何原因,请使用JLabel .getSize()和JLabel.getLocation()来计算框架上是否显示标签。

答案 1 :(得分:0)

总有办法。 事先知道,每当用户对您的窗口执行某些操作时,屏幕上每个可见的方法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