Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 JPanel大小在开始时未知_Java_Swing_Jframe_Jpanel - Fatal编程技术网

Java JPanel大小在开始时未知

Java JPanel大小在开始时未知,java,swing,jframe,jpanel,Java,Swing,Jframe,Jpanel,当我从Square实例创建一个Board实例时,我尝试将窗口的大小分配给整数x和y。我没能做到这一点,因为一开始的大小似乎是0。在Board.java中的构造函数中,x和y不应该像现在这样为-50 Square.java: package Square; import javax.swing.*; public class Square extends JFrame { public Square(){ add(new Board()); setSi

当我从Square实例创建一个Board实例时,我尝试将窗口的大小分配给整数x和y。我没能做到这一点,因为一开始的大小似乎是0。在Board.java中的构造函数中,x和y不应该像现在这样为-50

Square.java:

package Square;

import javax.swing.*;

public class Square extends JFrame {

    public Square(){
        add(new Board());
        setSize(800, 800);
        setVisible(true);
    }

    public static void main(String[] args){
        new Square();
    }
}
Board.java

package Square;

import javax.swing.*;
import java.awt.*;

public class Board extends JPanel{
    int x,y;

    public Board(){
        x = width-50;
        y = height-50;
    }

    public int width = (int) getSize().getWidth();
    public int height = (int) getSize().getHeight();

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.fillRect(x,y, 100, 100);
    }
}
package Square;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Board extends JPanel implements ActionListener{

    Timer timer;
    int x, y;
    int velX = 0;
    int velY = 0;

    public Board(){
        setFocusable(true);
        timer = new Timer(1, this);
        addKeyListener(new TAdapter());
    }

    class TAdapter extends KeyAdapter{

        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();

            switch(keyCode){
                case KeyEvent.VK_ESCAPE: x = width()/2-50; y = height()/2-50; break;
                case KeyEvent.VK_RIGHT: velX = 1; break;
                case KeyEvent.VK_DOWN: velY = 1; break;
                case KeyEvent.VK_LEFT: velX = -1; break;
                case KeyEvent.VK_UP: velY = -1; break;
            }
        }

        public void keyReleased(KeyEvent e){
            velX = 0;
            velY = 0;
        }
    }
    public int width(){ return (int) getSize().getWidth();}
    public int height(){ return (int) getSize().getHeight();}

    public void start(){
        timer.setInitialDelay(100);
        timer.start();
        x = width()/2-50;
        y = height()/2-50;
    }



    @Override
    public void actionPerformed(ActionEvent e) {
        x += velX;
        y += velY;
        repaint();
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(x,y, 100, 100);
    }
}
澄清的完整代码: Square.java

package Square;

import javax.swing.*;

public class Square extends JFrame {

    public Square(){
        Board board = new Board();
        board.start();
        add(board);
        setTitle("Square");
        setSize(800, 800);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args){
        Square square = new Square();
        square.setVisible(true);
        square.setLocation(2000, 150);
    }
}
Board.java

package Square;

import javax.swing.*;
import java.awt.*;

public class Board extends JPanel{
    int x,y;

    public Board(){
        x = width-50;
        y = height-50;
    }

    public int width = (int) getSize().getWidth();
    public int height = (int) getSize().getHeight();

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.fillRect(x,y, 100, 100);
    }
}
package Square;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Board extends JPanel implements ActionListener{

    Timer timer;
    int x, y;
    int velX = 0;
    int velY = 0;

    public Board(){
        setFocusable(true);
        timer = new Timer(1, this);
        addKeyListener(new TAdapter());
    }

    class TAdapter extends KeyAdapter{

        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();

            switch(keyCode){
                case KeyEvent.VK_ESCAPE: x = width()/2-50; y = height()/2-50; break;
                case KeyEvent.VK_RIGHT: velX = 1; break;
                case KeyEvent.VK_DOWN: velY = 1; break;
                case KeyEvent.VK_LEFT: velX = -1; break;
                case KeyEvent.VK_UP: velY = -1; break;
            }
        }

        public void keyReleased(KeyEvent e){
            velX = 0;
            velY = 0;
        }
    }
    public int width(){ return (int) getSize().getWidth();}
    public int height(){ return (int) getSize().getHeight();}

    public void start(){
        timer.setInitialDelay(100);
        timer.start();
        x = width()/2-50;
        y = height()/2-50;
    }



    @Override
    public void actionPerformed(ActionEvent e) {
        x += velX;
        y += velY;
        repaint();
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(Color.RED);
        g.fillRect(x,y, 100, 100);
    }
}

将计算结果放入paintComponent方法中。通常,您希望避免在paintComponent中使用会使其变慢的代码,但这些调用不应该给出太多的惩罚。此外,如果您的程序是可重新调整大小的,您需要能够像这样重新计算移动中的事物的大小:

public void paintComponent(Graphics g){
    super.paintComponent(g);
    int x = getWidth() - 50;
    int y = getHeight() - 50;
    g.fillRect(x, y, 100, 100);
}
但当然,在你真正的程序中,你会想要避免“神奇”的数字

另一个问题:不要在JFrame上调用
setSize()
。相反,如果要指定硬大小,请在JPanel中重写其
getPreferredSize()
方法。这还将为您提供可用于计算的建议参数


例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

@SuppressWarnings("serial")
public class DrawRect extends JPanel {
   private static final int PREF_W = 800;
   private static final int PREF_H = PREF_W;
   private static final int DELTA = 50;
   private static final Color RECT_COLOR = Color.red;
   private static final int RECT_WIDTH = 100;
   private static final int TIMER_DELAY = 15;
   private int rectX = PREF_W - DELTA;
   private int rectY = PREF_H - DELTA;

   public DrawRect() {
      new Timer(TIMER_DELAY, new TimerListener()).start();
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.setColor(RECT_COLOR);
      g.fillRect(rectX, rectY, RECT_WIDTH, RECT_WIDTH);
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         rectX--;
         rectY--;
         repaint();
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("DrawRect");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new DrawRect());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

另外,请查看我的“关键点绑定”动画代码

import java.awt.*;
导入javax.swing.*;
导入java.awt.event.*;
导入java.util.EnumMap;
导入java.util.HashMap;
导入java.util.Map;
公共类游戏面板扩展了JPanel{
专用静态最终int动画_延迟=15;
私人最终内部高度=400;
专用最终整数宽度=600;
私人广场;
私有EnumMap dirMap=新EnumMap(Direction.class);
私有映射keyToDir=newhashmap();
//!!私人圈子;
私人定时器动画定时器;
公共游戏小组(){
for(Direction dir:Direction.values()){
dirMap.put(dir,Boolean.FALSE);
}
keyToDir.put(KeyEvent.VK_UP,Direction.UP);
keyToDir.put(KeyEvent.VK_DOWN,Direction.DOWN);
keyToDir.put(KeyEvent.VK_左,Direction.LEFT);
keyToDir.put(KeyEvent.VK_RIGHT,Direction.RIGHT);
//!!addKeyListener(新的DirectionListener());
setKeyBindings();
挫折地面(颜色:白色);
setPreferredSize(新尺寸(宽度、高度));
设置聚焦(真);
正方形=新正方形();
animationTimer=新计时器(ANIMATION_DELAY,new AnimationListener());
animationTimer.start();
}
私有void setKeyBindings(){
int condition=当在聚焦窗口中时;
最终InputMap InputMap=getInputMap(条件);
final ActionMap ActionMap=getActionMap();
布尔[]键按下={true,false};
for(整数键代码:keyToDir.keySet()){
Direction dir=keyToDir.get(keyCode);
用于(布尔onKeyPress:keyPressed){
布尔值onKeyRelease=!onKeyPress;//以明确绑定的工作方式
击键击键=击键。getKeyStroke(键代码,0,
onKeyRelease);
Object key=keyStroke.toString();
inputMap.put(击键,键);
put(key,newkeybindingsaction(dir,onKeyPress));
}
}
}
公共组件(图形g){
超级组件(g);
方形显示器(g);
}
私有类AnimationListener实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件evt){
布尔重绘=假;
for(Direction dir:Direction.values()){
if(dirMap.get(dir)){
方。移动(直接);
重新绘制=真;
}
}
如果(重新喷漆){
重新油漆();
}
}
}
私有类KeyBindingsAction扩展了AbstractAction{
私人指导主任;
布尔按下;
公钥绑定操作(方向方向,按布尔值){
this.dir=dir;
this.pressed=pressed;
}
@凌驾
已执行的公共无效操作(操作事件evt){
dirMap.put(dir,按下);
}
}
私有静态void createAndShowGUI(){
GamePanel GamePanel=新建GamePanel();
JFrame=新JFrame(“游戏面板”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(游戏面板);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
gamePanel.requestFocusInWindow();
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI();
}
});
}
}
枚举方向{
向上(0,-1),向下(0,1),左(-1,0),右(1,0);
私人int incrX;
私营企业;
私人方向(内部控制,内部控制){
this.incrX=incrX;
this.incrY=incrY;
}
public int getIncrX(){
返回incrX;
}
public int getIncrY(){
返回incrY;
}
}
阶级广场{
私有整数x=0;
私有整数y=0;
私人int w=20;
私有int h=w;
私有整数步长=1;
私有颜色=Color.red;
私有颜色fillColor=新颜色(255、150、150);
私人行程行程=新的基本行程(3f,基本行程,
基本行程。加入(轮);
公共空间显示(图形g){
Graphics2D g2d=(Graphics2D)g.create();
g2d.setColor(fillColor);
g2d.fillRect(x,y,w,h);
g2d.设定行程(行程);
g2d.setColor(彩色);
g2d.drawRect(x,y,w,h);
g2d.dispose();
}
公共无效设置步骤(内部步骤){
这个步骤=步骤;
}
公共无效移动(方向目录){
x+=步骤*dir.getIncrX();
y+=步骤*dir.getIncrY();
}
}

例如,在下一个EDT周期中,可以使用SwingUtilities.invokeLater在面板变为可见后获取x和y值。

嘿,您的代码样式很糟糕,但我尝试提供帮助:)。无法获得未绘制窗口的大小。首先,您的构造函数是错误的,您添加了实际创建Board Obj的板。调用构造函数
public class Board extends JPanel{
    int x,y;
    JFrame parent;

    public Board(JFrame parent){

         int width =  parent.getPreferredSize().width;
         int height = parent.getPreferredSize().height;
        x = width-50;
        y = height-50;
    }



    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.fillRect(x,y, 100, 100);
    }
}