我有9个形式相同的代码,例如:
btnExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btnExitActionPerformed(evt);
}
});
...有9个相应的链接代码,如下所示:
private void btnExitActionPerformed(ActionEvent evt) {
// some code *********************
}
......以及大量类似的重复代码
适用于FocusListener
和MouseListener
。
我试图通过分配来减少代码行数 按钮的文本到其动作命令并使用:
public void actionPerformed(ActionEvent e)
{
String c = e.getActionCommand();
switch (c) {
case "Clear output": btnClearOutputActionPerformed(e); break;
case "Search": btnSearchActionPerformed(e); break;
case "Exit": btnExitActionPerformed(e); break;
...
}
}
它有效,但情况并不好。仍然重复。寻找优雅。
我无法相信以下方法甚至可以编译,但它不起作用,因为doClick()
递归调用该方法。我天真地希望doClick()
执行方法btnPatternMouseClickedActionPerformed()
。
public void actionPerformed(ActionEvent e){
Component[] c ;
c = theFrame.getComponents();
JButton b;
for(Component x: c)
{
if(x instanceof JButton)
{
b = (JButton) x;
if(b.getText().equals(e.getActionCommand()))
{
b.doClick(); // want it to execute code elsewhere
return;
}
}
}
}
起初我觉得上面的方法很接近。现在我要放弃了。
我有三个问题:
(1)有没有办法减少前两段所示的重复代码?
(1a)上面的最后一种方法是否接近?可以轻松修复吗?
(2)类似于上面的actionPerformed
方法(使用switch
的方法)替换FocusListener
和MouseListener
代码的技巧是否会浪费时间实施?
答案 0 :(得分:3)
你可以改变这个:
btnExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
btnExitActionPerformed(evt);
}
});
...有9个相应的链接代码,如下所示:
private void btnExitActionPerformed(ActionEvent evt) {
// some code *********************
}
到此:
btnExit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// same code that was in the btnExitActionPerformed method.
}
});
但也许更好的方法是将你的“控制”代码,监听器中的代码,你的“视图”代码,你的GUI分开,但是如何做到这将取决于你的问题和当前的代码库。 / p>
修改强>
你问:
我会责怪Swing GUI构建器(不好?)的习惯。
它并不是那么糟糕,并且比使用GUI类实现监听器接口更好很多。
为什么Swing会这样做?为什么Swing会做很多事情!!
我不确定你的具体含义是什么。
所以关于“更好”:你是说将听众分成另一个类文件吗?你是否建议椰子迁移~~ ...
是的,是的。事实上,控件 - 监听器部分可以由几个类组成,但它们都可以在单个主控制类中使用。
我的意思是,我应该放弃我问题中的最后一种方法?
是
答案 1 :(得分:1)
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class Example implements ActionListener{
JButton buttons[] = new JButton[12];
public Example(){
for(int c=0; c<buttons.length; c++){
buttons[c]=new JButton("I am button"+c);
buttons[c].addActionListener(this);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == buttons[0]){}
if(e.getSource() == buttons[1]){}
if(e.getSource() == buttons[2]){}
if(e.getSource() == buttons[3]){}
if(e.getSource() == buttons[4]){}
if(e.getSource() == buttons[5]){}
if(e.getSource() == buttons[6]){}
if(e.getSource() == buttons[7]){}
//....
}
}
这对你的代码来说还不够优雅吗?
其他东西: 例如,如果您具有位于同一团队中的按钮,例如: 拥有一个类(java Object)然后获取对象并创建按钮是一个好主意。
public class TVButton implements ActionListener{
public TVButton(String name,String whatever){
}
@Override
public void actionPerformed(ActionEvent e){
//actionFor this button
}
}