Java - 在 JTextField 中输入一些字母后,JFrame 一直卡住

标签 java swing jframe paintcomponent repaint

我不知道为什么我的 JFrame 在我在 JTextField“用户名”和“密码”中输入字母后一直卡住:/任何人都可以查看我的代码并告诉我原因并修复它吗?

public class Main 
{       
    public static void main(String [ ] args)
    {    
        LoginWindow loginframe = new LoginWindow();
        loginframe.setVisible(true);
        loginframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        loginframe.initialize();    
        while(true)
        {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            loginframe.Repaint();
        }
    }
}

框架类:

public class LoginWindow extends JFrame implements MouseListener, KeyListener, MouseMotionListener{

    public LoginWindow(){
        setSize(806, 629);
        setResizable(false);
        setLayout(new BorderLayout());
        background = new JLabel(ResourceLoader.Iconload("/main_01.jpg"));
        background.setBounds(0, 0, 800, 600);
        add(background);            
        background.setLayout(null);
        Username = new JTextField("", 20);
        Username.setForeground(Color.WHITE);
        Username.setBounds(312, 433, 170, 40);
        Username.setFont(new Font("Impact", Font.BOLD, 25));
        Username.setBackground(Color.BLACK);
        Username.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.BLACK));
        background.add(Username);           
        Password = new JPasswordField("", 20);
        Password.setForeground(Color.WHITE);
        Password.setBounds(312, 489, 170, 40);
        Password.setBackground(Color.BLACK);
        Password.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.BLACK));
        Password.setFont(new Font("Serif", Font.BOLD, 25));
        background.add(Password);
    }

    public void initialize()
    {
        makestrat();    
        addKeyListener(this);
        requestFocus();
        addMouseListener(this);
        addMouseMotionListener(this);    
    }

    public void makestrat()
    {
        createBufferStrategy(2);
        strat = getBufferStrategy(); 
    }

    public void Repaint()
    {           
        //System.out.println(mouseX + " " + mouseY);
        Graphics g = strat.getDrawGraphics();
        paintComponents(g);
        Draw(g);
        g.dispose();            
        strat.show();
    }

    public void Update()
    {           
    }

    public void Draw(Graphics g)
    {
        if(((mouseX >= 499) && (mouseX <=  669)) && ((mouseY >= 433)&&( mouseY <= 530))){
            g.drawImage(ResourceLoader.ImageLoad("/login_02.jpg"), 502, 459, null);
        }else{
            g.drawImage(ResourceLoader.ImageLoad("/login_01.jpg"), 502, 459, null);
        }
    }

    private class thehandler implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent event) {   

        }           
    }

    public void mouseMoved(MouseEvent event)
    {
        mouseY = event.getY()-26;
        mouseX = event.getX()-3;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        PointerInfo a = MouseInfo.getPointerInfo();
        Point point = new Point(a.getLocation());
        SwingUtilities.convertPointFromScreen(point, e.getComponent());
        double mouseX = (int) point.getX();
        double mouseY = (int) point.getY(); 
        System.out.println("(ContainerPos) Mouse clicked! X: " + mouseX + " Y: " + mouseY);
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void mousePressed(MouseEvent e) {            
    }

    @Override
    public void mouseReleased(MouseEvent e) {           
    }

    @Override
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub          
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub          
    }
}

最佳答案

  1. 您不需要将 while 循环与 Thread.sleeap() 结合使用。它正在破坏你的程序。
  2. 您在这里想要实现的目标,即连续调用重绘,可以使用 javax.swing.Timer 轻松完成
  3. 不要显式调用 paintComponent。对 real repaint() 方法的实际调用将为您完成此操作。无需创建模仿Repaint()
  4. 使用 JPanel 进行绘画,而不是尝试在 JFrame 上绘画
  5. 我会初始化,然后设置可见
  6. 您的代码甚至无法编译,因此我可以尝试为您修复。
  7. 使用 Java 命名约定:方法和变量以小写字母开头。
  8. 这是一个example of a simple Login Window ,使用模态 JDialog
  9. 了解如何使用Layout Managers而不是依赖 setBounds()
<小时/>

第 2 点。您的 main 应该如下所示

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            LoginWindow loginframe = new LoginWindow();
            loginframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            loginframe.initialize();
            loginframe.setVisible(true);
        }
    });
}

在构造函数中,使用 javax.swing.Timer 而不是 while 循环

private Timer timer = null;
private DrawPanel drawPanel = new DrawPanel();  // see below for DrawPanel
public LoginWindow() {
    // add drawPanel somewhere
    ...
    timer = new Timer (50, new ActionListener(){
        public void actionPerformed(ActionEvent e) {
            drawPanel.repaint();
        }
    });
    timer.start();
}
<小时/>

第 4 点。 有一个内部 JPanel 类,您可以在其中完成所有绘制,并将该组件添加到框架中。您需要重写 paintComponent 方法。

private DrawPanel extends JPanel {
    @Override
    protected void paintComponent(Graophics g) {
        super.paintComponent(g);
        Draw(g);
    }
}

关于Java - 在 JTextField 中输入一些字母后,JFrame 一直卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21079070/

相关文章:

java - 异常 : java. lang.String 无法转换为 java.lang.Integer

java - 匹配器以避免以 s、ing 结尾的单词或中间的单词

Java - 动态网格布局

java - 检查是什么触发了 WindowClosing 事件

java - JPanel 转换,我的代码有什么问题?

java - 从 Jtable 更新数据库行 : Error

java - 在 pom.xml 中切换元素的最佳方法

java - 获取滚动金额

java - 获取 Swing GridLayout 中特定行和列的小部件

java - JComponent 未设置位置或文本