Java 自己的JPOpupMenus显著降低了应用程序的速度
我有个问题,伙计们,请你们帮忙。 我在自己的JPopupMenu中添加了允许更改计算方法的功能,但现在我的整个应用程序都慢了很多,我将其缩小到我制作的以下类:Java 自己的JPOpupMenus显著降低了应用程序的速度,java,performance,swing,jpopupmenu,Java,Performance,Swing,Jpopupmenu,我有个问题,伙计们,请你们帮忙。 我在自己的JPopupMenu中添加了允许更改计算方法的功能,但现在我的整个应用程序都慢了很多,我将其缩小到我制作的以下类: class PopUpTimeCalcMethodChangeClickListener extends MouseAdapter { PopUpMenuTimeCalcMethodChange menu; public void mousePressed(MouseEvent e){ if (e.isPo
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;
}
}
类PopupTimeCalMethodChangeClickListener扩展了MouseApter{
PopUpMenuTimeCalcMethodChange菜单;
公共无效鼠标按下(MouseEvent e){
如果(如isPopupTrigger())
doPop(e);
}
公共无效MouseEvent(MouseEvent e){
如果(如isPopupTrigger())
doPop(e);
}
私有无效doPop(MouseEvent e){
如果(菜单==null)
menu=new PopUpMenuTimeCalcMethodChange();
show(例如getComponent(),0,0);
}
}
类PopUpMenuTimeCalcMethodChange扩展了JPopupMenu{
公共PopUpMenuTimeCalcMethodChange(){
最终字符串[]calctyps={“按上次下载计算”,“按平均速度计算”};
对于(int i=0;i你确定减速是由你在问题中输入的类引起的吗?如果我接受你的popupmenUtimeCalMethodChange
类并添加一个简单的Main
类,应用程序对我来说并没有减速。你注意到减速的程度了吗?你可以在应用程序中的某些点打印时间来获得一些信息度量。您可以添加更多代码以确保问题不在其他地方吗?(您的PopupMenuTimeCalMethodChangeClickListener
类似乎未被PopupMenuTimeCalMethodChange
类使用。)
这是我尝试的代码:
// 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;
}
}
//主类:
导入javax.swing.*;
公共班机{
受保护的静态int TimeLeftCalculationMode;
公共静态void main(最终字符串[]参数){
新建Main().launchGui();
}
私有void launchGui(){
最终JFrame=新JFrame(“堆栈溢出”);
机架立根(100100800600);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
最终JPanel面板=新JPanel();
panel.setComponentPopupMenu(新的PopupMenuTimeCalMethodChange());
frame.getContentPane().add(面板);
frame.setVisible(true);
}
}
//PopUpMenuTimeCalcMethodChange类:
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
公共类PopUpMenuTimeCalcMethodChange扩展了JPopupMenu{
公共PopUpMenuTimeCalcMethodChange(){
最后一个字符串[]calctyps={“按上次下载计算”,
“按平均速度计算”};
对于(int i=0;如果要更快地获得帮助,请发布一个or。不要创建新的JPopupMenu,只需更改弹出窗口中显示的菜单项。还要使用JComponent\setComponentPopupMenu
。经过一个下午的尝试和错误后,我很确定提到的类不是唯一的麻烦源,它更像是压碎我的应用程序的最后一滴。t感谢您抽出时间:)祝您在调查这个问题时好运。有几种很好的Java探查器可能会有所帮助。有关建议,请参阅示例。