java JPanel大小在开始时未知
当我从Square实例创建一个Board实例时,我试图将窗口的大小分配给整数x和y。我没有这样做,因为在开始时,大小似乎是0。在板上的构造函数中。java、x和y不应该像现在这样是-50
广场。爪哇:
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();
}
}
董事会。爪哇
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.*;
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);
}
}
董事会。爪哇
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);
}
}
# 1 楼答案
嘿,你的代码风格很糟糕,但我试着帮你:)。你不能得到一个未绘制的窗口的大小。首先,你的构造器是错误的,你添加了实际创建Board Obj的电路板。调用Board的构造函数,它还没有绘制的父对象,也没有x,y集。尝试在构造函数中初始化变量。所以只需使用宽度和高度,并在构造函数中填充值。接下来,只需通过传递其父级大小的构造函数变量来告诉你的电路板它的创建大小。 我认为你会尝试学习java,这会更加优雅。此外,在添加一些之前,尝试进行所有父级修改。因此,首先设置大小,添加一些布局(边框/流程/whatuwish),然后获取框架内容窗格并添加电路板组件。为了明确起见,您无法获取Constructor中的父对象和父对象大小,因为您的board Obj尚未创建和添加。如果希望获取父对象()及其大小,请创建对象并将其添加到JFrame,然后调用getParent()。getSize()。得到0是因为此时(在创建之前)没有绘制JPanel。如果您希望获得父级大小,只需将JFrame Ref传递给构造函数或其大小。另一个建议是,不要在things in things中创建东西,记住你的代码,你创建的JPanel是第一个对象。。。下面是一些示例代码: 广场:
董事会: