伙计们,我遇到了一个问题,请你们帮忙。我在自己的JPopupMenu中添加了允许更改计算方法的内容,但现在我的整个应用程序速度明显减慢,我将其缩小到我创建的类:
class PopUpTimeCalcMethodChangeClickListener extends MouseAdapter {
PopUpMenuTimeCalcMethodChange menu;
public void mousePressed(MouseEvent e){
if (e.isPopupTrigger())
doPop(e);
}
public void mouseReleased(MouseEvent e){
if (e.isPopupTrigger())
doPop(e);
}
private void doPop(MouseEvent e){
if(menu == null)
menu = new PopUpMenuTimeCalcMethodChange();
menu.show(e.getComponent(), 0, 0);
}
}
class PopUpMenuTimeCalcMethodChange extends JPopupMenu {
public PopUpMenuTimeCalcMethodChange(){
final String[] calctyps = {"Calculate by last download","Calculate by average speed"};
for(int i = 0;i<calctyps.length;i++){
final JCheckBox setCalcMethod = new JCheckBox(calctyps[i]);
setCalcMethod.setIconTextGap(15);
if(Main.TimeLeftCalculationMode == i)
setCalcMethod.setSelected(true);
setCalcMethod.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
for(Component c : getmenu().getComponents()){
if(c.getClass() == JCheckBox.class){
((JCheckBox) c).setSelected(false);
}
}
setCalcMethod.setSelected(true);
System.out.println("lol we are running");
int index = -1;
for (int i=0;i<calctyps.length;i++) {
if (calctyps[i].equals(setCalcMethod.getText())) {
index = i;
break;
}
}
Main.TimeLeftCalculationMode = index;
}
});
add(setCalcMethod);
}
}
public JPopupMenu getmenu(){
return this;
}
}
主要的问题是,代码在ui第一次执行后减慢了它的速度,尽管它已经不可见了。我想这是关于动作听众的,但我不确定。
你确定减速是由你在问题中放入的类引起的吗?如果我取你的PopUpMenuTimeCalcMethodChange
类并添加一个简单的Main
类,那么应用程序对我来说并没有变慢。你注意到变慢了多少?您可以在应用程序中的某些点打印时间以获得一些测量值。你能添加更多的代码来确保问题不在其他地方吗?(您的PopUpTimeCalcMethodChangeClickListener
类似乎未被PopUpMenuTimeCalcMethodChange
类使用。)
这是我尝试过的代码:
// Main class:
import javax.swing.*;
public class Main {
protected static int TimeLeftCalculationMode;
public static void main(final String[] arguments) {
new Main().launchGui();
}
private void launchGui() {
final JFrame frame = new JFrame("Stack Overflow");
frame.setBounds(100, 100, 800, 600);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
final JPanel panel = new JPanel();
panel.setComponentPopupMenu(new PopUpMenuTimeCalcMethodChange());
frame.getContentPane().add(panel);
frame.setVisible(true);
}
}
// PopUpMenuTimeCalcMethodChange class:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PopUpMenuTimeCalcMethodChange extends JPopupMenu {
public PopUpMenuTimeCalcMethodChange(){
final String[] calctyps = {"Calculate by last download",
"Calculate by average speed"};
for(int i = 0;i<calctyps.length;i++){
final JCheckBox setCalcMethod = new JCheckBox(calctyps[i]);
setCalcMethod.setIconTextGap(15);
if(Main.TimeLeftCalculationMode == i)
setCalcMethod.setSelected(true);
setCalcMethod.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
for(Component c : getmenu().getComponents()){
if(c.getClass() == JCheckBox.class){
((JCheckBox) c).setSelected(false);
}
}
setCalcMethod.setSelected(true);
System.out.println("lol we are running");
int index = -1;
for (int i=0;i<calctyps.length;i++) {
if (calctyps[i].equals(setCalcMethod.getText())) {
index = i;
break;
}
}
Main.TimeLeftCalculationMode = index;
}
});
add(setCalcMethod);
}
}
public JPopupMenu getmenu(){
return this;
}
}