gpt4 book ai didi

java - JPanel:在创建时自动绘制?

转载 作者:行者123 更新时间:2023-11-29 06:15:54 30 4
gpt4 key购买 nike

这一定是相当琐碎和直接的,但我想不通。

这是我的 JPanel 的样子,它被添加到 JFrame 中:

private class RadarPanel extends JPanel {       
public RadarPanel() {
super();
this.repaint();
}

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);

//painting logic here

//repaint in 500 ms
this.repaint(500);
}
}

现在,当我调整 JFrame 的大小时,这个 JPanel 开始一直重绘。但是,当我不调整 JFrame 的大小时,JPanel 的 paintComponent 方法似乎没有被调用,即使我在构造函数中调用了 repaint。

有什么建议吗?谢谢。

更新:

更完整的代码(除了绘图逻辑之外的所有内容):

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

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

public class PlayerRadar extends JFrame {
private static final long serialVersionUID = 230324190;

//settings
private static final int windowWidth = 300;
private static final int windowHeight = 300;
private static final int maxDistance = 250;

//components
private PlayerRadar radarWindow;
private JPanel radarPanel;

public PlayerRadar(String title) {
super(title);

//set reference
radarWindow = this;

//create radar window
Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
this.setAlwaysOnTop(true);
this.setBackground(new Color(0xFFFFFF));
this.setBounds(screenSize.width - windowWidth, 0, windowWidth, windowHeight);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
radarWindow.setVisible(false);
}
});
this.setVisible(true);

//create a JPanel for drawing
radarPanel = new RadarPanel();
radarPanel.setBounds(0, 0, windowWidth, windowHeight);
radarPanel.setBackground(new Color(0xFFFFFF));

//add to frame
this.getContentPane().add(radarPanel);
}

private class RadarPanel extends JPanel {
private static final long serialVersionUID = 230324191;
private static final int repaintInterval = 500;

public RadarPanel() {
super();
}

@Override
public void paint(Graphics g) {
super.paint(g);

//draw player oval (center of the frame)
g.setColor(Color.BLUE); //blue
int ovalWidth = (int) Math.round(this.getWidth() / 30);
int ovalHeight = (int) Math.round(this.getHeight() / 30);
int playerLocalX = (int) Math.round(this.getWidth() / 2);
int playerLocalY = (int) Math.round(this.getHeight() / 2);
int ovalX = playerLocalX - ovalWidth / 2;
int ovalY = playerLocalY - ovalHeight / 2;
g.fillOval(ovalX, ovalY, ovalWidth, ovalHeight);
g.setColor(Color.BLACK); //black
g.drawOval(ovalX, ovalY, ovalWidth, ovalHeight);

//get info of the player itself
PlayerInfo thisPlayer = GameUtil.getPlayerInfo();
float playerPosZ = thisPlayer.position[0];
float playerPosX = thisPlayer.position[2];
//float playerRotRad = thisPlayer.rotation;

//set rectangle specs
int rectWidth = this.getWidth() / 40;
int rectHeight = this.getWidth() / 40;

//only continue if we have information about our player
if (thisPlayer != null) {
//get nearby players
ArrayList<PlayerInfo> playersInfo = GameUtil.getNearbyPlayers();

//for each other player, draw a rectangle
for (PlayerInfo playerInfo : playersInfo) {
//get data
float posZ = playerInfo.position[0];
float posX = playerInfo.position[2];
//float rotRad = playerInfo.rotation;

//calculate relative x and y
int rectX = playerLocalX + Math.round((posX - playerPosX) / maxDistance * this.getWidth() / 2) - rectWidth / 2;
int rectY = playerLocalY + ovalHeight / 2 + Math.round((playerPosZ - posZ) / maxDistance * this.getHeight() / 2) - rectHeight / 2;

//draw rectangle
g.setColor(Color.RED);
g.fillRect(rectX, rectY, rectWidth, rectHeight);
g.setColor(Color.BLACK);
g.drawRect(rectX, rectY, rectWidth, rectHeight);
}
}

//repaint soon
this.repaint(repaintInterval);
}
}
}

最佳答案

你第一次纠正的地方。自定义绘画是在 paintComponent() 方法中完成的,而不是 paint() 方法。

永远不要在 paintComponent() 方法中调用 repaint(),因为这会导致无限循环。

如果你想为这幅画制作动画,那么你应该使用 Swing Timer 来安排动画。

您不应该使用 use setSize()。这是布局管理器的工作。相反,您可以覆盖面板的 getPreferredSize() 方法(或使用 setPreferredSize()),然后您可以 pack() 框架,而不是设置其大小。

应在框架可见之前将面板添加到框架,否则它的大小为 (0, 0),这意味着没有可绘制的内容。

关于java - JPanel:在创建时自动绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5097889/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com