[英]How to make my JLabels red with use of aspectJ?
我的項目有一個MessageUtil類,該類具有顯示消息的方法,我正在嘗試使用AspectJ將Jlabels的文本設為紅色,而無需使用AspectJ,將“ for循環”添加到使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來使JLabels變成紅色,而不是在方法createMultiLabel的主體中使用for循環,我不知道如何執行此操作,我試圖制作一個包含帶有pointCut的aspecJ批注的類在將消息發送到createMultiLabelBySlashN()和createMultiLabelByPixel()作為它們的參數之前,將數組消息變為紅色,但是我不知道它是否正確或如何從我的AspectJ中的createMultiLabel方法定義JLabel messages []。類,使用相同的for循環使其變為紅色,然后將String rezult發送到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
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]
Voilà-對標簽着色的橫切關注點已被模塊化為一個方面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.