gpt4 book ai didi

java - 如何让 JPanel 填充父 JFrame

转载 作者:行者123 更新时间:2023-12-02 12:36:59 24 4
gpt4 key购买 nike

我正在尝试在窗口中心画一个圆,但我似乎无法正确绘制,应该很容易!我的理解是,如果将 JPanel 设置为 JFrame 的内容 Pane ,则默认布局是 flowLayout,并且该绘图应从屏幕左上角的 0,0 开始。为了尝试弄清楚发生了什么,我画了一个填充 JPanel 的蓝色背景,但它似乎有一个边距,如下所示:

enter image description here

当窗口变得小于蓝色矩形时,绘图开始从另一侧被剪切:

enter image description here

这是怎么回事!这是我的代码:

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

public class Test extends JFrame {

public static void main(String args[])
{
Test test = new Test();
test.Start();
}

public void Start()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(500, 500);
CirclePanel circlePanel = new CirclePanel();
this.setContentPane(circlePanel);
this.setVisible(true);
}

public class CirclePanel extends JPanel
{
private int radius = 200;

public void paintComponent(Graphics g) {
g.setColor(Color.blue);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.red);
int diameter = radius * 2;
g.fillOval(getX(), getY(), diameter, diameter);
}

public int getX()
{
return (this.getWidth()/2) - radius;
}

public int getY()
{
return (this.getHeight()/2) - radius;
}
}
}

最佳答案

一个大问题是,您在不知不觉中重写了布局管理器用来定位组件的两个关键方法,即 getX()getY() 方法,从而你弄乱了 JPanel 的位置。

因此,首先也是最重要的是,重命名这些方法,这样您就不会意外移动 JPanel。

另外,不要忘记调用 super 的 PaintComponent 方法,并避免调用 setSize()。相反,在您的 JPanel 上覆盖 getPreferredSize,并打包您的 JFrame。

例如,

public int getMyX() {
return myX;
}

public int getMyY() {
return myY;
}
<小时/>

例如

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

public class Test extends JFrame {

public static void main(String args[]) {
//!!
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Test test = new Test();
test.Start();
}
});
}

public void Start() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// this.setSize(500, 500);
CirclePanel circlePanel = new CirclePanel();
setContentPane(circlePanel);
pack();
setVisible(true);
}

public class CirclePanel extends JPanel {
private static final int PREF_W = 500;
private static final int PREF_H = PREF_W;
private int radius = 200;

public void paintComponent(Graphics g) {
super.paintComponent(g); //!!
g.setColor(Color.blue);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setColor(Color.red);
int diameter = radius * 2;
g.fillOval(getMyX(), getMyY(), diameter, diameter);
}

//!!
public int getMyX() {
return (this.getWidth() / 2) - radius;
}

//!!
public int getMyY() {
return (this.getHeight() / 2) - radius;
}

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

关于java - 如何让 JPanel 填充父 JFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28571426/

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