Ich bin neu in Java Programmierung, aber ein erfahrener C++ Programmierer. Ich lernte, wie man GUIs mit Swing programmiert. Ich habe mich gefragt, wie ressourcenintensiv (Laufzeit und Arbeitsspeicher) ActionListener sind? Gibt es eine allgemeine Richtlinie für die Gesamtzahl der Listener, die in einem bestimmten Programm erstellt werden sollten? Wie viele, bis die Leistung beeinträchtigt wird?Wie ressourcenintensiv sind Listener in Java?
Ich lerne gerade Java durch die Deitel Developer Series Java für Programmierer Buch. In einem bestimmten Beispiel haben sie ein Array von JRadioButtonItems als private Variable für die Klasse. Sie hatten auch eine ItemHandler-Klasse erstellt, die von der ActionListener-Klasse, die eine lineare Suche auf dem gesamten Array von Optionsfeldern durchführte, erweitert wurde, um die ausgewählte auszuwählen und den Status des Programms entsprechend zu ändern. Alle Optionsfelder im Array haben denselben Aktion Listener. Dies schien ziemlich ineffizient zu sein, um eine lineare Suche nach Informationen durchzuführen, so dass ich die ActionListener-Klasse neu geschrieben hatte, um den vorgeschlagenen Wert im Konstruktor zu ändern, und jedem Optionsfeld einen eigenen ActionListener mit dem vorgeschlagenen Wert zu geben, der vom Konstruktor übergeben wurde eine lineare Suche durchführen. Welche Methode wäre leistungsfähiger? Ich entschuldige mich dafür, dass ich wie ein Noob aussah, ich versuche nur, eine gute Gewohnheit für die Programmierung in Java zu entwickeln. Beigefügt ist ein kleines Beispiel für den Code. Vielen Dank.
/************************************************************************
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]);
}
}
Sie heben eine gute Frage: Sie können in meinen Artikeln interessiert sein Zuhörer im Allgemeinen sehr wenig tun sollten. Wenn sie etwas Komplexes tun müssen, sollten sie einen neuen Thread erzeugen, idealerweise mit der SwingWorker-Klasse, und dann sofort zurückkehren. –