【问题标题】:Why does the JPanel resize on repaint?为什么 JPanel 在重绘时会调整大小?
【发布时间】:2019-12-08 09:44:02
【问题描述】:

我的代码有问题:当我运行应用程序时,会显示添加到另一个 JPanel 的 JPanel,但是当父面板重新绘制时,子面板的大小会调整为 10x10 或类似的大小。 这是我的代码:

public class GUIv2 extends JPanel {
Vector<Section> sections = new Vector<>();
String backgroundImage = "";

public GUIv2(String bgImage) {
    backgroundImage = bgImage;
}

public void addSection(int id, int x, int y, int width, int height) throws RuntimeException {
    for(Section sec : sections) {
        if(sec.getId() == id) {
            throw new RuntimeException("The given ID is already registered.");
        }
    }
    sections.add(new Section(id));
    sections.lastElement().setBounds(100, 100, 100, 100);
    this.add(sections.lastElement());
    this.repaint();
}
public Section getSection(int id) {
    for(Section sec : sections) {
        if(sec.getId() == id) {
            return sec;
        }
    }
    return null;
}

protected void paintComponent(Graphics g) {
    try {
        g.drawImage(ImageIO.read(new File(backgroundImage)).getScaledInstance(getWidth(), getHeight(), 100), 0, 0, null);
    }
    catch(IOException e) {

    }
}
}

我希望有人可以帮助我解决这个问题。提前致谢

【问题讨论】:

  • 显示添加到另一个 JPanel 的 JPanel, - JPanel 的默认布局管理器是 FlowLayout,它尊重添加到其中的任何组件的首选大小。您没有设置绘画面板的首选尺寸,因此在布局完成后您只能获得 (10 x 10) 正方形。您需要设置首选尺寸。阅读 Custom Painting 上的 Swing 教程中的部分以获取工作演示。从工作演示代码开始,然后根据您的要求进行修改。

标签: java swing resize jpanel repaint


【解决方案1】:

该代码存在几个大问题:

  1. 您正在对放置在不使用null 布局的容器(JPanel)中的组件调用setBounds(...)。这意味着setBounds(...) 最初可能会按照您的意愿显示,但以后不会显示,或者根本不会被遵循。
  2. 您使用的是setBounds(...)。几乎总是(99% 的时间)让组件的首选大小和容器的布局管理器处理组件的大小
  3. 您正在使用绘画方法读取图像,这会不必要地减慢 GUI 的感知响应速度。为什么不断地重新读取图像?而是在组件创建时读取一次,将图像存储在变量中,然后简单地在绘画方法中绘制图像,这里是paintComponent
  4. 您没有在覆盖方法中调用 super.paintComponent(g),从而阻止 Swing 清理脏像素。
  5. 忽略 IO 异常并将图像作为文件读取。更好地处理异常 - 至少得到通知,并将图像作为类资源而不是文件读取,因为这样您可以将所有内容打包在 JAR 文件中,并且您的图像将可以访问。

都表明你还没有学习相应的相关教程。您可以在此处找到 Swing 教程和其他 Swing 资源的链接:Swing Info

任何时候调整 GUI 的大小,布局管理器都会重新布局组件,并且所有设置的“边界”都会被忽略,从而导致组件缩小。有更好的方法来控制组件的大小和放置,我们无法在不知道并查看您正在尝试创建的 GUI 的情况下建议这些方法。

【讨论】:

  • “我们无法在不知道并看到您正在尝试创建的 GUI 的情况下提出建议。” 提供 ASCII 艺术或意图的简单绘图 最小尺寸的 GUI 布局,如果可调整大小,则具有更大的宽度和高度 - 以显示应如何使用额外空间。 当我在这里时:为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example
  • 顺便说一句 - 你错过了 "6) 在绘制方法(异步方法调用)中缩放图像,但不提供图像观察器来通知缩放何时完成。"
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 2011-05-17
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多