2015-11-14 5 views
1

У меня есть панель с кучей меток, посредине рамки. Некоторые из ярлыков внутри не видны внутри панели, причиной их расположения.Как определить, можно ли увидеть компонент?

Вот представление, чтобы увидеть, что лучше (синяя граница панели, зеленые коробки внутри него находятся метки, которые видны, в то время как красный не являются)

enter image description here Этикетки инстанцируются внутри для цикла, как это ...

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, но оба возвращает ложь для всех, заменив строку (логическое) SetVisible с чем-то вроде этого ...

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

Клетка объектов имеет SetVisible (ложь) внутри его конструктор, уверен, что это не влияет на мою цель, поскольку я установил их в true после их создания, но я мог ошибаться.

+0

Так что, если я правильно понимаю, красные не видны на экране (человеческим глазом)? – kukis

+0

да, вы правы – user3921890

ответ

1

Если у вас стандартный размер, вы можете рассчитать, какие метки видны, а какие нет (если ваш размер рамки можно изменить, вы всегда можете получить его меры с помощью JFrame.getSize(). Если метки по-разному различаются по какой-либо причине, используйте JLabel.getSize() и JLabel.getLocation(), чтобы вычислить, если метка отображается на раме.

+0

спасибо, это мне очень помогло. я был слишком сконцентрирован на поиске встроенного метода, когда я мог просто получить расположение метки и посмотреть, больше ли это размера панели – user3921890

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; 
    } 

SSSCEhere