Generic Buttons и Action Listeners для использования в классах GUI [dубликат]

Другой метод (разделение по модулю и поиск) заслуживает особого упоминания здесь из той же ссылки, предоставленной @ anton-tykhyy. этот метод очень похож по эффективности на метод умножения и поиска DeBruijn с небольшим, но важным различием.

модуляция и поиск

unsigned int v; // find the number of trailing zeros in v int r; // put the result in r static const int Mod37BitPosition[] = // map a bit value mod 37 to its position { 32, 0, 1, 26, 2, 23, 27, 0, 3, 16, 24, 30, 28, 11, 0, 13, 4, 7, 17, 0, 25, 22, 31, 15, 29, 10, 12, 6, 0, 21, 14, 9, 5, 20, 8, 19, 18 }; r = Mod37BitPosition[(-v & v) % 37];

модуль модуляции и метод поиска возвращают разные значения для v = 0x00000000 и v = FFFFFFFF, тогда как метод умножения и поиска DeBruijn возвращает ноль на обоих входах.

test: -

unsigned int n1=0x00000000, n2=0xFFFFFFFF; MultiplyDeBruijnBitPosition[((unsigned int )((n1 & -n1) * 0x077CB531U)) >> 27]); /* returns 0 */ MultiplyDeBruijnBitPosition[((unsigned int )((n2 & -n2) * 0x077CB531U)) >> 27]); /* returns 0 */ Mod37BitPosition[(((-(n1) & (n1))) % 37)]); /* returns 32 */ Mod37BitPosition[(((-(n2) & (n2))) % 37)]); /* returns 0 */
7
задан Kari 21 December 2009 в 08:57
поделиться

3 ответа

Самый простой способ сделать это:

  // label1 и label2 - это панели JLabel // panel1 и panel2 - это doActionsForLabel (label1) JPanel;  doActionsForLabel (label2);  public void doActionsForLabel (метка JLabel) {if (label.getParent () == panel1) {// выполнить действие # 1} else if (label.getParent () == panel2) {// сделать действие # 2}}  

В приведенном выше коде предполагается, что метки являются прямыми дочерними элементами JPanels. Однако это не всегда так, иногда это правнуки или правнуки на панели. Если это так, у вас будет несколько более сложных операций для перемещения родительской иерархии.

  public void doActionsForLabel (метка JLabel) {boolean flag = true;  Component parent = label;  while (flag) {parent = parent.getParent ();  if ((parent! = null) & amp; & amp; (parent instanceof JPanel)) {if (label.getParent () == panel1) {// сделать действие # 1} else if (label.getParent () == panel2)  {// do action # 2}} else {flag = false;  }}}  

Как предложил Гордон, если вы не хотите проверять равенство компонентов, вы можете проверить соответствие свойств компонентов:

Вместо label.getParent () == panel1 , сделайте это или аналогично: label.getParent (). GetName (). Equals ("panel_1_name") . [ ! d7]

3
ответ дан bguiz 16 August 2018 в 00:39
поделиться

Если вы запустите label.getParent () , он вернет панель, внутри которой находится метка.

Затем вы можете вызвать parent.getName () , но тот факт, что у вас теперь будет объект, который вам может не понадобиться сейчас.

10
ответ дан Nate 16 August 2018 в 00:39
поделиться

Если вы не знаете, насколько глубоко ваш ярлык находится в иерархии, в SwingUtilities есть некоторые удобные функции: SwingUtilities.getAncestorOfClass (класс, компонент)

Альтернативой проверке имени родительского контейнера в ваших ярлыках может быть просто переслать событие в родительский контейнер и позволить родителям выполнить эту работу. В зависимости от того, что вы пытаетесь достичь, было бы полезно отделить этикетки от родителей. События пересылки могут быть выполнены с использованием Component. [D1] processEvent (AWTEvent) .

3
ответ дан Samuel Sjöberg 16 August 2018 в 00:39
поделиться
  • 1
    И public static Container getAncestorNamed (String name, Component comp) , если мы знаем имя. Благодаря! – WesternGun 19 April 2017 в 09:50
Другие вопросы по тегам:

Похожие вопросы: