之前介绍了简单的注入方法,现在介绍 GUI的注入
一、使用包含技术修改GUI元素
假设有一个窗体类 Ex1 extends JFrame , 其标题为 Example #1 (Eval Version) , 现在想去掉不想要的内容,要求不使用反编译器,不重新编译源代码的情况下,我们可以使用包含技术(定义一个新类,调用Ex1的方)
定义类 Ex1
import java.awt.*;
import java.awt.evet.*;
import javax.swing.*;
public class Ex1 extends JFrame implements ActionListener
{
private JButton btnExit;
public Ex1()
{
super("Example #1 (Eval Version)");
Container c = getContentPane();
btnExit = new JButton("Exit");
btnExit.addActionListener(this);
c.add(btnExit);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent ae)
{
setVisible(false);
System.exit(0);
}
}
下面制作我们的注入类 Helper
import java.awt.*;
import java.awt.evet.*;
import javax.swing.*;
public class Helper implements ActionListener
{
private static Ex1 ex = null;
public void setTitle(String title) // 设置窗口标题
{
ex.setTitle(title);
}
public void setButtonText(String text) // 获取按钮控件 并且设置文本以及事件监听程序
{
Container c = ex.getContentPane();
int size = c.getComponentCount();
for(int i=0;i<size;i++)
{
Component cc = c.getComponent(i);
if( cc instanceof JButton )
{
((JButton)cc).setText(text);
((JButton)cc).addActionListener(this);
break;
}
}
}
public void actionPerformed(ActionEvent ae)
{
JOptionPane.showMessage(ex,"真的要退出吗?","Really?",0);
setVisible(false);
System.exit(0);
}
public static void main(String args[])
{
Helper hp = new Helper();
ex = new Ex1();
ex.setVisible(false);
// add my code
hp.setTitle("Example #1");
hp.setButtonText("Shit is good");
// end my code
ex.setVisible(true);
}
}