Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java图形窗口仅在调整大小时更新_Java_Swing_User Interface - Fatal编程技术网

java图形窗口仅在调整大小时更新

java图形窗口仅在调整大小时更新,java,swing,user-interface,Java,Swing,User Interface,此代码用于在屏幕上移动矩形。 由于某些原因,除非最小化或调整窗口大小,否则它不会更新 我意识到这已经被问过很多次了,但我发现答案是非常具体的或超出我的理解。 我是java新手,如果我看起来像个笨蛋,我很抱歉 您正在创建一个额外的矩形对象,并对其调用repaint(),而这不是显示的对象,因此侦听器不会重新绘制显示的JPanel。不要这样做。只创建一个矩形对象,以便重新绘制到正确的引用 e、 例如,改变这一点: import java.awt.Color; import java.awt.Dime

此代码用于在屏幕上移动矩形。 由于某些原因,除非最小化或调整窗口大小,否则它不会更新

我意识到这已经被问过很多次了,但我发现答案是非常具体的或超出我的理解。
我是java新手,如果我看起来像个笨蛋,我很抱歉

您正在创建一个额外的矩形对象,并对其调用repaint(),而这不是显示的对象,因此侦听器不会重新绘制显示的JPanel。不要这样做。只创建一个矩形对象,以便重新绘制到正确的引用

e、 例如,改变这一点:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;



//import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

class Rectangle extends JPanel {
   private static int rect_x = 40;
   private static int rect_y = 40;
   private static final int rect_width = 100;
   private static final int rect_height = rect_width;




    KeyListener listener;

    public Rectangle() {

            this.listener = new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e)
            {
            }
            @Override
            public void keyPressed(KeyEvent e)
            {
                //System.out.println(e.getKeyCode());

                // w
                if(e.getKeyCode() == 87)
                {
                    rect_y -= 10;
                    //revalidate();
                    repaint();

                }
                // s
                else if (e.getKeyCode() == 83)
                {
                    rect_y += 10;
                    repaint();

                }
                // a
                else if (e.getKeyCode() == 65)
                {
                    rect_x -= 10;
                    repaint();

                }
                // d
                else if (e.getKeyCode() == 68)
                {
                    rect_x += 10;
                    repaint();


                }
            }
            @Override
            public void keyReleased(KeyEvent e)
            {
            }
        };  }





   @Override
   public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawRect(rect_x, rect_y, rect_width, rect_height);
    g.fillRect(rect_x, rect_y, rect_width, rect_height);
    g.setColor(Color.BLACK);
}

   @Override
   public Dimension getPreferredSize() {
      // so that our GUI is big enough
      return new Dimension(rect_width + 2 * rect_x, rect_height + 2 * rect_y);   
   }

   // create the GUI explicitly on the Swing event thread
   private void createAndShowGui() {
      Rectangle mainPanel = new Rectangle();

      JFrame frame = new JFrame("DrawRect");

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
      frame.addKeyListener(listener);
   }




   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Rectangle Rct = new Rectangle();
            Rct.createAndShowGui();


        }

      });



   }
}
为此:

  Rectangle mainPanel = new Rectangle();  // ***** no!!! ****

  JFrame frame = new JFrame("DrawRect");

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  frame.getContentPane().add(mainPanel);  // **** no ****
  frame.pack();
  frame.setLocationByPlatform(true);
  frame.setVisible(true);
  frame.addKeyListener(listener);
其他附带问题:

  • 与KeyListener相比,更喜欢键绑定
  • 避免使用神奇的数字,如密钥代码,这会使调试变得困难。而是使用
    KeyEvent.VK?
    常量
  • 遵循Java命名约定:常量应全部为大写
  • rect_x和y字段不应是静态的

好的,谢谢你现在能用了,也谢谢你解释为什么不能用:)变量最近被更改了,谢谢你指出这一点。你说的幻数是什么意思?我还是想用一个非静态的东西,我现在怎么称呼它呢?刚刚启动了另一个程序,这仍然很有用!
  // Rectangle mainPanel = new Rectangle();

  JFrame frame = new JFrame("DrawRect");

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  frame.getContentPane().add(this);  // ****** note change
  frame.pack();
  frame.setLocationByPlatform(true);
  frame.setVisible(true);
  frame.addKeyListener(listener);