java swing 的代码重构
Code refactoring for java swing
我想知道是否可以重构我的代码以消除几乎相同语句的重复,禁止变量名以及使用方法将其初始化为什么。这是有问题的代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Menu extends JFrame {
private JButton jbtChoc1 = new JButton("cross.gif");
private JButton jbtChoc2 = new JButton("nought.gif");
private JButton jbtChoc3 = new JButton("cross.gif");
private JButton jbtChoc4 = new JButton("nought.gif");
private JButton jbtChoc5 = new JButton("cross.gif");
private JButton jbtChoc6 = new JButton("nought.gif");
private JLabel foodLabelChoice = new JLabel("Main Dishes");
private ImageIcon food1Image = new ImageIcon("cross.gif");
private ImageIcon food2Image = new ImageIcon("nought.gif");
private ImageIcon food3Image = new ImageIcon("cross.gif");
private ImageIcon food4Image = new ImageIcon("nought.gif");
private ImageIcon food5Image = new ImageIcon("cross.gif");
private ImageIcon food6Image = new ImageIcon("nought.gif");
/**
* Constructor for the Menu.
*/
public Menu() {
Container cont = getContentPane();
cont.setLayout(new BorderLayout(5, 5));;
cont.setBackground(Color.white);
cont.add(foodLabelChoice, BorderLayout.NORTH);
JPanel girdSetup = new JPanel(new GridLayout(2, 3, 5, 5));
jbtChoc1.setIcon(food1Image);
girdSetup.add(jbtChoc1);
jbtChoc1.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc1.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc2.setIcon(food2Image);
girdSetup.add(jbtChoc2);
jbtChoc2.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc2.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc3.setIcon(food3Image);
girdSetup.add(jbtChoc3);
jbtChoc3.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc3.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc4.setIcon(food4Image);
girdSetup.add(jbtChoc4);
jbtChoc4.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc4.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc5.setIcon(food5Image);
girdSetup.add(jbtChoc5);
jbtChoc5.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc5.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc6.setIcon(food6Image);
girdSetup.add(jbtChoc6);
jbtChoc6.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc6.setHorizontalTextPosition(AbstractButton.CENTER);
cont.add(girdSetup, BorderLayout.CENTER);
}
/**
* Main method for test.
*
* @param args Initial setup.
*/
public static void main(String[] args) {
Menu frame = new Menu();
frame.setTitle("Menu");
frame.setSize(950, 400);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我想删除 JButton 和 ImageIcon 声明的重复以及它们在构造函数中的设置,这样我只需调用一个方法而不是 copy/paste 代码。
您可以通过将它们包装在数组中来做到这一点,如下所示:
private static final String[] imageNames = {"cross.gif",
"nought.gif",
"cross.gif",
"nought.gif",
"cross.gif",
"nought.gif"};
private JButton[] jbtChocs = new JButton[imageNames.length];
private ImageIcon[] foodImages = new ImageIcon[imageNames.length];
public Menu() {
/* ... */
for(int i = 0; i < imageNames.length; i++){
jbtChocs[i] = new JButton(imageNames[i]);
foodImages[i] = new ImageIcon(imageNames[i]);
jbtChocs[i].setIcon(foodImages[i]);
girdSetup.add(jbtChocs[i]);
jbtChocs[i].setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChocs[i].setHorizontalTextPosition(AbstractButton.CENTER);
}
}
由于所有对象的行为都相同,因此您可以简单地遍历每个对象,对每个对象应用相同的操作。
我想知道是否可以重构我的代码以消除几乎相同语句的重复,禁止变量名以及使用方法将其初始化为什么。这是有问题的代码:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Menu extends JFrame {
private JButton jbtChoc1 = new JButton("cross.gif");
private JButton jbtChoc2 = new JButton("nought.gif");
private JButton jbtChoc3 = new JButton("cross.gif");
private JButton jbtChoc4 = new JButton("nought.gif");
private JButton jbtChoc5 = new JButton("cross.gif");
private JButton jbtChoc6 = new JButton("nought.gif");
private JLabel foodLabelChoice = new JLabel("Main Dishes");
private ImageIcon food1Image = new ImageIcon("cross.gif");
private ImageIcon food2Image = new ImageIcon("nought.gif");
private ImageIcon food3Image = new ImageIcon("cross.gif");
private ImageIcon food4Image = new ImageIcon("nought.gif");
private ImageIcon food5Image = new ImageIcon("cross.gif");
private ImageIcon food6Image = new ImageIcon("nought.gif");
/**
* Constructor for the Menu.
*/
public Menu() {
Container cont = getContentPane();
cont.setLayout(new BorderLayout(5, 5));;
cont.setBackground(Color.white);
cont.add(foodLabelChoice, BorderLayout.NORTH);
JPanel girdSetup = new JPanel(new GridLayout(2, 3, 5, 5));
jbtChoc1.setIcon(food1Image);
girdSetup.add(jbtChoc1);
jbtChoc1.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc1.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc2.setIcon(food2Image);
girdSetup.add(jbtChoc2);
jbtChoc2.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc2.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc3.setIcon(food3Image);
girdSetup.add(jbtChoc3);
jbtChoc3.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc3.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc4.setIcon(food4Image);
girdSetup.add(jbtChoc4);
jbtChoc4.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc4.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc5.setIcon(food5Image);
girdSetup.add(jbtChoc5);
jbtChoc5.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc5.setHorizontalTextPosition(AbstractButton.CENTER);
jbtChoc6.setIcon(food6Image);
girdSetup.add(jbtChoc6);
jbtChoc6.setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChoc6.setHorizontalTextPosition(AbstractButton.CENTER);
cont.add(girdSetup, BorderLayout.CENTER);
}
/**
* Main method for test.
*
* @param args Initial setup.
*/
public static void main(String[] args) {
Menu frame = new Menu();
frame.setTitle("Menu");
frame.setSize(950, 400);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我想删除 JButton 和 ImageIcon 声明的重复以及它们在构造函数中的设置,这样我只需调用一个方法而不是 copy/paste 代码。
您可以通过将它们包装在数组中来做到这一点,如下所示:
private static final String[] imageNames = {"cross.gif",
"nought.gif",
"cross.gif",
"nought.gif",
"cross.gif",
"nought.gif"};
private JButton[] jbtChocs = new JButton[imageNames.length];
private ImageIcon[] foodImages = new ImageIcon[imageNames.length];
public Menu() {
/* ... */
for(int i = 0; i < imageNames.length; i++){
jbtChocs[i] = new JButton(imageNames[i]);
foodImages[i] = new ImageIcon(imageNames[i]);
jbtChocs[i].setIcon(foodImages[i]);
girdSetup.add(jbtChocs[i]);
jbtChocs[i].setVerticalTextPosition(AbstractButton.BOTTOM);
jbtChocs[i].setHorizontalTextPosition(AbstractButton.CENTER);
}
}
由于所有对象的行为都相同,因此您可以简单地遍历每个对象,对每个对象应用相同的操作。