1

私のプロジェクトには MessageUtil クラスがあり、メッセージを表示するメソッドがあります。aspectJ を使用して Jlabels のテキストを赤くしようとしています。aspectJ を使用せずに、multiLabel を作成するメソッドの 1 つに「for ループ」を追加するだけで十分です。メール:

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) の 2 つのメソッドは次の形式です。

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

メソッドcreateMultiLabelの本体でforループを使用せずに、aspectJを使用してJLabelsを赤くしたいのですが、これを行う方法がわかりません。pointCutでaspecJアノテーションを含むクラスを作成しようとしていますメッセージが createMultiLabelBySlashN() および createMultiLabelByPixel() にパラメーターとして送信される前に、配列メッセージを赤くするために以下を使用しますが、それが正しいかどうか、または私のアスペクトでメソッド createMultiLabel から JLabel メッセージ [] を定義する方法がわかりません。クラスで同じ for ループを使用して赤くし、文字列の結果を createMultiLabelBySlashN に送信します。

@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
4

1 に答える 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;
    }
}

AspectJ を使用せずにメソッドを実行すると、次のmainコンソール出力が表示されます。

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]

ほら - ラベルに色を付けるという分野横断的な懸念は、モジュール化されてアスペクトに組み込まれました。

于 2015-03-28T14:43:22.100 に答える