Другой метод (разделение по модулю и поиск) заслуживает особого упоминания здесь из той же ссылки, предоставленной @ 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 */
Самый простой способ сделать это:
// 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]
Если вы запустите label.getParent ()
, он вернет панель, внутри которой находится метка.
Затем вы можете вызвать parent.getName ()
, но тот факт, что у вас теперь будет объект, который вам может не понадобиться сейчас.
Если вы не знаете, насколько глубоко ваш ярлык находится в иерархии, в SwingUtilities
есть некоторые удобные функции: SwingUtilities.getAncestorOfClass (класс, компонент)
Альтернативой проверке имени родительского контейнера в ваших ярлыках может быть просто переслать событие в родительский контейнер и позволить родителям выполнить эту работу. В зависимости от того, что вы пытаетесь достичь, было бы полезно отделить этикетки от родителей. События пересылки могут быть выполнены с использованием Component. [D1] processEvent (AWTEvent)
.
public static Container getAncestorNamed (String name, Component comp)
, если мы знаем имя. Благодаря!
– WesternGun
19 April 2017 в 09:50