2017-02-28 74 views
3

我做了这个小测试:(去掉了所有不相关的问题)更改JFrame的内容很慢,或者我只是做错了吗?

package de.poller.StorrageBox; 

import java.awt.Dimension; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MainClass implements KeyListener { 

    JFrame frame; 
    JPanel panel1; 
    JPanel panel2; 

    public static void main(String[] args) { 
     MainClass c=new MainClass(); 
    } 

    public MainClass() { 
     frame=new JFrame("test"); 
     frame.setSize(new Dimension(500, 500)); 
     frame.addKeyListener(this); 

     panel1=new JPanel(); 
     JButton butt1=new JButton("test1111"); 
     panel1.add(butt1); 

     panel2=new JPanel(); 
     JButton butt2=new JButton("test222"); 
     panel2.add(butt2); 

     frame.add(panel1); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.requestFocus(); 

    } 


    @Override 
    public void keyPressed(KeyEvent arg0) { 

     if(arg0.getKeyChar()=='a') { 
      activate1(); 
      val(); 
     } 
     if(arg0.getKeyChar()=='b') { 
      activate2(); 
      val(); 
     } 
    } 

    private void activate2() { 
     frame.remove(panel1); 
     frame.add(panel2); 
    } 

    private void activate1() { 
     frame.remove(panel2); 
     frame.add(panel1); 
    } 

    private void val() { 
     frame.revalidate(); 
     frame.requestFocus(); 
    } 


    public void keyReleased(KeyEvent arg0) {} 


    public void keyTyped(KeyEvent arg0) {} 

} 

从面板1到2的第一个变化是好的,但如果我切换回1它需要一个相当很长一段时间(比我希望用户有更多的时间等待),这只是一个带有一个按钮的面板。没有完整的计划。

这里的问题是:重新验证(我认为是这个过程)如此缓慢,还是我在做一些可怕的错误?

+4

而不是删除和添加像你frame.revalidate后做什么,你应该使用CardLayout – ControlAltDel

+1

尝试添加frame.repaint() ()它可能只是一个延迟重新绘制的问题 – ControlAltDel

+0

没有听说过cardLayout之前(好awt对我而言是新的) 工作完美。万分感谢。我将我的工作代码作为未来的另一个答案。 非常感谢你 – Ranndom

回答

3

由于ControllAltDel解决方案:

(CardLayout)

package de.poller.StorrageBox; 

import java.awt.CardLayout; 
import java.awt.Dimension; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MainClass implements KeyListener { 

    JFrame frame; 
    JPanel panel; 

    JPanel panel1; 
    JPanel panel2; 

    public static void main(String[] args) { 
     MainClass c=new MainClass(); 
    } 

    public MainClass() { 
     frame=new JFrame("test"); 
     frame.setSize(new Dimension(500, 500)); 
     frame.addKeyListener(this); 

     panel=new JPanel(new CardLayout()); 
     frame.add(panel); 

     panel1=new JPanel(); 
     JButton butt1=new JButton("test1111"); 
     panel1.add(butt1); 

     panel2=new JPanel(); 
     JButton butt2=new JButton("test222"); 
     panel2.add(butt2); 

     panel.add(panel1,"1"); 
     panel.add(panel2,"2"); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.requestFocus(); 

    } 


    public void keyPressed(KeyEvent arg0) { 

     if(arg0.getKeyChar()=='a') { 
      activate1(); 
     } 
     if(arg0.getKeyChar()=='b') { 
      activate2(); 
     } 
    } 

    private void activate2() { 
     CardLayout cl=(CardLayout)(panel.getLayout()); 
     cl.show(panel, "2"); 
    } 

    private void activate1() { 
     CardLayout cl=(CardLayout)(panel.getLayout()); 
     cl.show(panel, "1"); 
    } 

    public void keyReleased(KeyEvent arg0) {} 

    public void keyTyped(KeyEvent arg0) {} 

} 
+1

而不是使用'KeyListener',它有焦点相关的问题,你真的想看看键绑定,这将有助于解决这个问题,并提出更多的可重用框架 – MadProgrammer

+0

你有任何关于?(我只是一个爱好人)的任何进一步的信息一堆“关键字”或链接将帮助我很多改进。 – Ranndom

+0

使用“Java密钥绑定”做一个快速的眼镜搜索,第一个链接应该给你一些好点子 – MadProgrammer

相关问题