Как сделать мой JLabels красным с использованием aspectJ?

1

у моего проекта есть класс MessageUtil, у которого есть методы для отображения сообщений. Я пытаюсь сделать тексты своих Jlabels red с использованием aspectJ, без использования aspectJ достаточно добавить 'for loop' к одному из методов, который делает multiLabel текстовое сообщение:

public static JLabel[] createMultiLabel(String msg) {

        JLabel[] messages = null;
        if (msg.contains("\n")) {
        messages =  createMultiLabelBySlashN(msg);
        } else {
            messages = createMultiLabelByPixel(msg);
        }
        //this for loop makes the text red
        for (int i = 0; i < messages.length; i++) {
            messages[i].setForeground(Color.RED);
        }
        return messages;
    }

Два метода createMultiLabelByPixel (msg) и createMultiLabelBySlashN (msg) находятся в этой форме:

private static JLabel[] createMultiLabelBySlashN(String msg) { 
// the code here 
}

Я хочу использовать aspectJ inorder, чтобы сделать JLabels красным, не используя цикл for в кубе метода createMultiLabel, я не знаю, как это сделать, я пытаюсь создать класс, содержащий аннотацию aspecJ с помощью pointCut ниже, чтобы сообщения массива были красными до отправки сообщений createMultiLabelBySlashN() и createMultiLabelByPixel() в качестве их параметра, но я не знаю, правильно ли это или как определить сообщения JLabel [] из метода createMultiLabel в моем аспектеJ класс, чтобы сделать его красным, используя тот же цикл, и отправить результат String для созданияMultiLabelBySlashN.

@Pointcut ("execution(public static JLabel[] mehad.util.MessageUtil.createMultiLabelBySlashN(..)) || execution(public static JLabel[] mehad.util.MessageUtil.createMultiLabelByPixel(..)" )

даже когда я вызываю pointCut, похоже, что есть ошибки с моим кодом, который гласит:

no match for this type name: JLabel
  • 0
    Мне интересно, достаточно ли ясен этот вопрос. Если вам нужна дополнительная информация, просто спросите
Теги:
aspectj

1 ответ

0
Лучший ответ

no match for this type name: JLabel

Это связано с тем, что вы не используете полное имя класса javax.swing.JLabel.

Теперь давайте предположим, что ваш класс выглядит так (просто простая подделка):

package mehad.util;

import javax.swing.JLabel;

public class MessageUtil {
    public static void main(String[] args) {
        for (JLabel label : createMultiLabel("Albert Einstein\nWerner Heisenberg\nMax Planck"))
            System.out.println(label.getText() + " / " + label.getForeground());
        System.out.println();
        for (JLabel label : createMultiLabel("Albert Einstein, Werner Heisenberg, Max Planck"))
            System.out.println(label.getText() + " / " + label.getForeground());
    }

    public static JLabel[] createMultiLabel(String msg) {
        return msg.contains("\n")
            ? createMultiLabelBySlashN(msg)
            : createMultiLabelByPixel(msg);
    }

    private static JLabel[] createMultiLabelBySlashN(String msg) {
        String[] lines = msg.split("\n+");
        JLabel[] labels = new JLabel[lines.length];
        for (int i = 0; i < lines.length; i++)
            labels[i] = new JLabel(lines[i]);
        return labels;
    }

    private static JLabel[] createMultiLabelByPixel(String msg) {
        String[] words = msg.split("[, ]+");
        JLabel[] labels = new JLabel[words.length];
        for (int i = 0; i < words.length; i++)
            labels[i] = new JLabel(words[i]);
        return labels;
    }
}

Теперь, если вы запустите main метод без AspectJ, вы увидите этот консольный вывод:

Albert Einstein / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Werner Heisenberg / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Max Planck / sun.swing.PrintColorUIResource[r=51,g=51,b=51]

Albert / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Einstein / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Werner / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Heisenberg / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Max / sun.swing.PrintColorUIResource[r=51,g=51,b=51]
Planck / sun.swing.PrintColorUIResource[r=51,g=51,b=51]

Т.е. все метки имеют серый цвет по умолчанию. Теперь добавьте этот аспект:

package de.scrum_master.aspect;

import java.awt.Color;

import javax.swing.JLabel;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class RedLabelAspect {
    @Pointcut("execution(static javax.swing.JLabel[] createMultiLabel(..))")
    public void multilabelCreation() {}

    @Around("multilabelCreation()")
    public JLabel[] changeLabelColours(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        JLabel[] labels = (JLabel[]) thisJoinPoint.proceed();
        for (JLabel label : labels)
            label.setForeground(Color.RED);
        return labels;
    }
}

Аспект изменяет метки, содержащиеся в массиве результатов, то есть цикл for теперь находится в вашем коде аспекта, больше не в базовом коде. Выход консоли изменяется на:

Albert Einstein / java.awt.Color[r=255,g=0,b=0]
Werner Heisenberg / java.awt.Color[r=255,g=0,b=0]
Max Planck / java.awt.Color[r=255,g=0,b=0]

Albert / java.awt.Color[r=255,g=0,b=0]
Einstein / java.awt.Color[r=255,g=0,b=0]
Werner / java.awt.Color[r=255,g=0,b=0]
Heisenberg / java.awt.Color[r=255,g=0,b=0]
Max / java.awt.Color[r=255,g=0,b=0]
Planck / java.awt.Color[r=255,g=0,b=0]

Voilà - сквозная проблема окраски этикеток была модульной в один аспект.

  • 0
    спасибо за полный ответ, но возникает вопрос, как работает pointcut без определения полного пути класса createMultiLabel (..)? Я имею в виду путь mehad.util.MessageUtil.
  • 0
    Pointcut соответствует любому методу с именем createMultiLabel в любом классе, см. Руководство по программированию AspectJ . Это не на 100% точно, но сколько подходящих имен методов у вас в системе? ;-)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню