如何使用 aspectJ 使我的 JLabel 变红?
How to make my JLabels red with use of aspectJ?
我的项目有一个 MessageUtil class,它有显示消息的方法,我正在尝试使用 aspectJ 使我的 Jlabels 的文本变红,而不使用 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 来使 JLabel 变红,而不是在方法 createMultiLabel 的主体中使用 for 循环,我不知道该怎么做,我正在尝试制作 class 包含带有下面 pointCut 的 aspecJ 注释,使数组消息在消息发送到 createMultiLabelBySlashN() 和 createMultiLabelByPixel() 作为参数之前变为红色,但我不知道它是否正确或如何定义 JLabel 消息[] 从我的 aspectJ 中的方法 createMultiLabel class 使用相同的 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
这是因为您没有使用完全限定的 class 名称 javax.swing.JLabel
。
现在让我们假设您的 class 看起来像这样(只是一个简单的伪造):
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]
瞧 - 为标签着色的横切关注点已模块化为一个方面。
我的项目有一个 MessageUtil class,它有显示消息的方法,我正在尝试使用 aspectJ 使我的 Jlabels 的文本变红,而不使用 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 来使 JLabel 变红,而不是在方法 createMultiLabel 的主体中使用 for 循环,我不知道该怎么做,我正在尝试制作 class 包含带有下面 pointCut 的 aspecJ 注释,使数组消息在消息发送到 createMultiLabelBySlashN() 和 createMultiLabelByPixel() 作为参数之前变为红色,但我不知道它是否正确或如何定义 JLabel 消息[] 从我的 aspectJ 中的方法 createMultiLabel class 使用相同的 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
这是因为您没有使用完全限定的 class 名称 javax.swing.JLabel
。
现在让我们假设您的 class 看起来像这样(只是一个简单的伪造):
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]
瞧 - 为标签着色的横切关注点已模块化为一个方面。