Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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_Resize_Jpanel_Repaint - Fatal编程技术网

Java 为什么重新绘制时JPanel会调整大小?

Java 为什么重新绘制时JPanel会调整大小?,java,swing,resize,jpanel,repaint,Java,Swing,Resize,Jpanel,Repaint,我的代码有一个问题:当我运行应用程序时,会显示添加到另一个JPanel的JPanel,但当父面板重新绘制时,子面板的大小会调整为10x10或类似的大小。 这是我的密码: public class GUIv2 extends JPanel { Vector<Section> sections = new Vector<>(); String backgroundImage = ""; public GUIv2(String bgImage) { backgroun

我的代码有一个问题:当我运行应用程序时,会显示添加到另一个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) {

    }
}
}
public类GUIv2扩展了JPanel{
向量部分=新向量();
字符串backgroundImage=“”;
公共GUI v2(字符串bgImage){
背景图像=背景图像;
}
public void addSection(int-id、int-x、int-y、int-width、int-height)抛出RuntimeException{
用于(第节:节){
如果(sec.getId()==id){
抛出新的RuntimeException(“给定ID已注册”);
}
}
增加(新的章节(id));
sections.lastElement().setBounds(100100100100);
this.add(sections.lastElement());
这个。重新绘制();
}
公共部分getSection(内部id){
用于(第节:节){
如果(sec.getId()==id){
返回秒;
}
}
返回null;
}
受保护组件(图形g){
试一试{
g、 drawImage(ImageIO.read(新文件(背景图像)).getScaledInstance(getWidth(),getHeight(),100),0,0,null;
}
捕获(IOE异常){
}
}
}

我希望有人能帮我解决这个问题。提前感谢

该代码有几个大问题:

  • 您正在对放置在不使用
    null
    布局的容器(JPanel)中的组件调用
    setBounds(…)
    。这意味着,
    setBounds(…)
    可以按照您最初的要求显示,但不能在以后显示,或者根本不遵循它
  • 您使用的是
    setBounds(…)
    。几乎总是(99%的时间)让组件的首选大小和容器的布局管理器处理组件的大小
  • 在绘制方法期间,您正在读取图像,这不必要地降低了GUI的响应速度。为什么要不断地重读中的图像?而是在组件创建时读取一次,将图像存储在一个变量中,而不是简单地使用绘制方法绘制图像,这里是
    paintComponent
  • 您没有在覆盖方法中调用
    super.paintComponent(g)
    ,从而阻止Swing清理脏像素
  • 忽略IO异常并将图像作为文件读取。更好的方法是处理异常——至少通知它们,并将图像作为类资源而不是文件读入,因为这样可以将所有内容打包到JAR文件中,并且图像是可访问的
  • 所有这些都表明您尚未学习相关的教程。您可以在此处找到指向Swing教程和其他Swing资源的链接:

    每当GUI重新调整大小时,布局管理器都会重新布局组件,所有设置的“边界”都会被忽略,从而导致组件收缩。有更好的方法来控制组件的大小和位置,如果不知道并了解您要创建的GUI,我们就无法推荐这些方法

    将显示添加到另一个JPanel的JPanel,-JPanel的默认布局管理器是FlowLayout,它尊重添加到其中的任何组件的首选大小。您没有设置绘画面板的首选尺寸,因此布局完成后,您只能得到(10 x 10)正方形。您需要设置首选大小。请阅读上Swing教程中的部分,以获得一个有效的演示。从工作演示代码开始,然后根据您的要求进行修改。“在不知道和不了解您试图创建的GUI的情况下,我们无法提出建议的方法。”以最小尺寸提供ASCII艺术或GUI预期布局的简单绘图,如果可以调整大小,更多的宽度和高度-展示如何使用额外的空间。当我在这里时:为了更快地获得更好的帮助,添加or.BTW-您错过了“6)在绘制方法(异步方法调用)中缩放图像,而没有提供图像观察者在缩放完成时通知。”