我是Java編程新手,但有經驗的C++程序員。我正在學習如何使用swing編程GUI。我想知道資源密集型(運行時以及內存)是否是ActionListeners?對於應該在特定程序中創建的聽衆總數是否有一般指導原則?有多少人受到影響?資源密集型是java中的聽衆嗎?
我目前正在通過Deitel開發人員系列Java for Programmers書籍學習Java。在一個特定的例子中,他們有一個JRadioButtonItems數組作爲這個類的一個私有變量。他們還創建了一個ItemHandler類,該類從ActionListener類擴展而來,該類對整個單選按鈕陣列進行線性搜索,以確定所選的那個並相應地更改程序的狀態。數組中的所有單選按鈕共享同一個Action Listener。這對於進行信息的線性搜索似乎相當低效,所以我重寫了ActionListener類,以便在構造函數中修改建議的值併爲每個單選按鈕分配給自己的ActionListener,並使用構造函數傳入的建議值以避免做一個線性搜索。哪種方法在性能方面更好?我很抱歉聽起來像一個noob,我只是想開發一套用Java編程的良好習慣。附件是代碼的一個小例子。謝謝。
/************************************************************************
Original code in Deitel book with linear search of selected Radio button in Actionlistener
****************************************************************************/
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
public class MenuTest extends JFrame{
private final Color colorValues[] = {Color.BLACK, Color.WHITE, Color.GREEN};
private JRadioButtonMenuItem colorItems[];
private ButtonGroup colorButtonGroup;
public MenuTest(){
super("Menu Test");
JMenu fileMenu = new JMenu("File");
JMenuBar bar = new JMenuBar();
setJMenuBar(bar);
bar.add(fileMenu);
String colors[] = {"Black", "White", "Green"};
JMenu colorMenu = new JMenu("Color");
colorItems = new JRadioButtonMenuItem[colors.length];
colorButtonGroup = new ButtonGroup();
ItemHandler itemHandler = new ItemHandler();
for(int count = 0; count < colors.length; count++){
colorItems[count] = new JRadioButtonMenuItem(colors[count]);
colorMenu.add(colorItems[count]);
colorButtonGroup.add(colorItems[count]);
colorItems[count].addActionListener(itemHandler);
}
colorItems[0].setSelected(true);
fileMenu.add(colorMenu);
fileMenu.addSeparator();
}
private class ItemHandler implements ActionListener{
public void actionPerformed(ActionEvent event){
for(int count = 0; count < colorItems.length; count++){
if(colorItems[count].isSelected()){
getContentPane().setBackground(colorValues[count]);
}
}
}
}
public static void main(String args[]){
MenuTest menuFrame = new MenuTest();
menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
menuFrame.setSize(600,400);
menuFrame.setVisible(true);
menuFrame.getContentPane().setBackground(menuFrame.colorValues[0]);
}
}
/************************************************************************
My Code redefined version of Deitel's w/o linear search in ActionListener
************************************************************************/
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
public class MenuTest extends JFrame{
private final Color colorValues[] = {Color.BLACK, Color.WHITE, Color.GREEN};
private JRadioButtonMenuItem colorItems[];
private ButtonGroup colorButtonGroup;
public MenuTest(){
super("Menu Test");
JMenu fileMenu = new JMenu("File");
JMenuBar bar = new JMenuBar();
setJMenuBar(bar);
bar.add(fileMenu);
String colors[] = {"Black", "White", "Green"};
JMenu colorMenu = new JMenu("Color");
colorItems = new JRadioButtonMenuItem[colors.length];
colorButtonGroup = new ButtonGroup();
ItemHandler itemHandler = new ItemHandler();
for(int count = 0; count < colors.length; count++){
colorItems[count] = new JRadioButtonMenuItem(colors[count]);
colorMenu.add(colorItems[count]);
colorButtonGroup.add(colorItems[count]);
colorItems[count].addActionListener(new ItemHandler(colorValues[count]));
}
colorItems[0].setSelected(true);
fileMenu.add(colorMenu);
fileMenu.addSeparator();
}
private class ItemHandler implements ActionListener{
private Color setColor;
public ItemHandler(Color inColor){
super();
setColor = inColor;
}
public void actionPerformed(ActionEvent event){
getContentPane().setBackground(setColor);
repaint();
}
}
public static void main(String args[]){
MenuTest menuFrame = new MenuTest();
menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
menuFrame.setSize(600,400);
menuFrame.setVisible(true);
menuFrame.getContentPane().setBackground(menuFrame.colorValues[0]);
}
}
你養好問題:聽衆一般應做的很少。如果他們需要做一些複雜的事情,他們應該產生一個新的線程,最好使用SwingWorker類,然後立即返回。 – 2009-07-07 07:54:54