调整窗口大小时 Java Swing 绘图消失

2023-11-29

我非常需要你的帮助,因为我自己无法解决这个问题。 我正在尝试创建一个 GUI,并想在按下按钮后在其中绘制一些内容,但我似乎遇到某种刷新/重新验证或线程问题。绘图已绘制,但是当我调整窗口大小时,绘图消失了。此外,当快速移动窗口时,部分绘图会消失。我已经尝试了很多方法,但我无法解决这个问题,也许你可以帮助我。我被指示不要一开始就编写自己的代码,而是使用 NetBeans 设计功能来生成按钮和面板等。也许这会损害绘图过程/功能,但我不知道。我将向您发布相关代码,并且非常感谢您的建议(注释掉的东西只是我之前尝试过的人工制品,所以不要介意):

public class NewJFrame extends JFrame  {
  public NewJFrame() { initComponents(); }

  @SuppressWarnings("unchecked")
  private void initComponents() {
    jButton1 = new javax.swing.JButton();
    jPanel1 = new javax.swing.JPanel();
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setMinimumSize(new java.awt.Dimension(1200, 1000));
    jButton1.setText("Draw");
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1ActionPerformed(evt);
      }
    });
    GroupLayout jPanel1Layout = new GroupLayout(jPanel1);
    jPanel1.setLayout(jPanel1Layout);
    jPanel1Layout.setHorizontalGroup(
        jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGap(0, 1000, Short.MAX_VALUE)
    );
    jPanel1Layout.setVerticalGroup(
        jPanel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGap(0, 0, Short.MAX_VALUE)
    );
    GroupLayout layout = new GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jPanel1, GroupLayout.DEFAULT_SIZE, 1000, Short.MAX_VALUE)
            .addGap(18, 18, 18)
            .addComponent(jButton1)
            .addGap(33, 33, 33))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(0, 745, Short.MAX_VALUE)
                    .addComponent(jButton1)
                    .addGap(237, 237, 237))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())))
    );

    pack();
  }// </editor-fold>

  private void jButton1ActionPerformed(ActionEvent evt) {
    Graphics g = jPanel1.getGraphics();
    draw(jPanel1, g);
  }

  protected void paintComponent(Graphics g){
    jPanel1.setSize(1000, 1000);
    Dimension d = jPanel1.getSize();
    g.setColor(Color.BLACK);
    for (int i=0; i<=1000;i++){
      if (i%100==0){
        g.setColor(Color.RED);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
      else if(i%50==0 && i%100!=0){
        g.setColor(Color.BLUE);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
      else {
        g.setColor(Color.BLACK);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
    }
    g.setColor(Color.green);
    g.drawLine(0, d.height / 2, d.width, d.height / 2);
  }

  public void draw(JPanel Jpanel1, Graphics g) {
    System.out.println("wuffkowski");
    Jpanel1.setSize(1000,1000);
    Dimension d = Jpanel1.getSize();
    g.setColor(Color.BLACK);
    for (int i=0; i<=1000;i++){
      if (i%100==0){
        g.setColor(Color.RED);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
      else if(i%50==0 && i%100!=0){
        g.setColor(Color.BLUE);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
      else {
        g.setColor(Color.BLACK);
        g.drawLine(i, d.height/2, i, (d.height/2)+100);
      }
    }
    g.setColor(Color.green);
    g.drawLine(0, d.height / 2, d.width, d.height / 2);
    Jpanel1.paintComponents(g);
  }

  public static void lala () {
    try {
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
          javax.swing.UIManager.setLookAndFeel(info.getClassName());
          break;
        }
      }
    } catch (ClassNotFoundException ex) {
      java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
      java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
      java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
      java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        NewJFrame JF =new NewJFrame();
        JF.setVisible(true);
      }
    });
  }
  private javax.swing.JButton jButton1;
  private javax.swing.JPanel jPanel1;
}

再次非常感谢您抽出宝贵的时间。


Java 不会为你记住绘图命令;当您单击按钮时,您的图形就会渲染一次,因为这是唯一一次draw()叫做。

如果您想在调整大小后刷新渲染,请覆盖paint(Graphics)并打电话draw()在那里。

如果这与按钮单击相关,则必须将字段添加到您的类中,在其中记住您需要的所有内容draw()包括它是否应该绘制任何东西的事实:

private boolean drawAtAll = false;

private void jButton1ActionPerformed(ActionEvent evt) {
  drawAtAll = true; // ok to draw now
  draw();
}

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

public void draw() {
  if( !drawAtAll ) return;

  Graphics g = jPanel1.getGraphics();
  ...
}

进一步阅读:

  • 课程:进行定制绘画
  • 在 AWT 和 Swing 中绘画
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调整窗口大小时 Java Swing 绘图消失 的相关文章

  • 有没有更简单的方法来分割/重建字符串?

    目前我正在使用String split 像这样 String tmp props get i getFullName split String name for int j 1 j lt tmp length j if j gt 1 nam
  • 仅使用公钥在 HD 钱包中生成以太坊地址 (bitcoinj/web3j)

    我尝试为使用 bitcoinj 库实现的 HD 钱包密钥生成以太坊地址 但我感到困惑 DeterministicSeed seed new DeterministicSeed some seed code here null 1409478
  • 如何在JavaFX中有效地滚动和缩放大图像?

    作为图像处理应用程序的一部分 我需要创建具有缩放 滚动和矢量叠加功能的简单查看器模块 图像相当大 40000x20000 这使得 ImageView 上的操作变慢 缓冲等 在 JavaFX 中处理巨大图像时 改善用户体验的最佳选项是什么 我
  • 如何将完整的日期格式拆分为日期和时间?

    我有很多格式为我的示例所示的字符串 我必须解析它们 我正在尝试确定今天是哪根弦 我的问题是 时间快到了 我只需要比较那个日期 接下来我想检查时间是否在 after 和 before 的两个时间戳 HH mm ss 之间 但存在问题 日期几乎
  • Glassfish 4 - JDBC 领域

    Glassfish 4 中的密码加密算法和摘要算法有什么区别 因为Password加密算法不能为空 所以我使用了MD5 Encoding使用了Hex 摘要算法为空 因此默认为 SHA 256 但是 如果我使用 JAAS 制作一个简单的登录应
  • AMQP Spring 集成错误处理

    我的集成流程如下所示 Bean public IntegrationFlow auditFlow Qualifier eventLoggingConnectionFactory ConnectionFactory connectionFac
  • 有没有办法让Maven自动下载快照版本?

    所以我有一个项目依赖于另一个项目的快照版本 依赖关系是
  • org.openqa.selenium.NoSuchSessionException:会话 ID 为空。调用 quit() 后使用 WebDriver?

    我已经进行了一些搜索 但仍然遇到同样的问题 我相信这可能是由于我的网络驱动程序是静态的造成的 我不太确定 在我的主课中 我包括了 BeforeTest and AfterTest BeforeTest包括根据我的 XML 文件启动新浏览器
  • Android:TelephonyManager 类

    我不明白为什么 API 文档中这么写TelephonyManager类是public 但是当我尝试创建一个实例时 它说它不是公共类 并且无法从包中访问 我看到它也说使用Context getSystemService Context TEL
  • Eclipse Oxygen - 该项目未构建,因为其构建路径不完整

    我刚刚安装了 Eclipse Oxygen 并尝试在工作台中打开现有项目 但收到此错误 该项目未构建 因为其构建路径不完整 不能 找到 java lang Object 的类文件 修复构建路径然后尝试 建设这个项目 我尝试右键单击该项目 转
  • ThreadPoolExecutor 和队列

    我以为使用线程池执行器 http docs oracle com javase 6 docs api java util concurrent ThreadPoolExecutor html我们可以提交Runnables 要在以下位置执行B
  • 如何在java中从包含.0的浮点数中删除小数部分

    我只想删除包含的浮点数的小数部分 0 所有其他数字都是可以接受的 例如 I P 1 0 2 2 88 0 3 56666 4 1 45 00 99 560 O P 1 2 2 88 3 567 4 1 45 99 560 有什么方法可以做到
  • Jersey 和 Spring 中的全局异常处理?

    我正在使用 Jersey 和 Spring 3 2 以及 Open CMIS 开发 RESTful Web 服务 我没有使用 Spring 的 MVC 模式 它只是 Spring IOC 和 Jersey SpringServlet 控制器
  • Log4j 2.0 中发现 ClassNotFoundException

    我已经设置了 log4j12 api beta2 jar 的构建路径 但它给出了 以下错误请帮我解决这个问题我的代码如下 java 文件 package com sst log4j class Product private int pro
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • Java DNSLookup MX 记录列表。类似于 MXToolBox

    我正在构建一个程序来列出域的所有 MX 记录 起初似乎工作正常 但与在线工具进行比较后http mxtoolbox com http mxtoolbox com 有些域程序无法获取 MX 记录 而 MXToolbox 可以 我不确定原因是什
  • 短 2 个字节

    我正在从串行端口读取一个长度为 133 字节的数据包 最后 2 个字节包含 CRC 值 我使用 Java 将 2 个字节值制成单个 我认为很短 这就是我所做的 short high 48 0x00ff short low 80 short
  • Web 服务客户端的 AXIS 与 JAX-WS

    我决定用Java 实现Web 服务客户端 我已经在 Eclipse 中生成了 Axis 客户端 并使用 wsimport 生成了 JAS WS 客户端 两种解决方案都有效 现在我必须选择一种来继续 在选择其中之一之前我应该 考虑什么 JAX
  • 如何从 Sublime Text 编辑器调试 Java 应用程序

    有时我正在对相当大的 Java 应用程序进行简单的修复 但我不想打开 Eclipse 来执行此任务 Eclipse 启动时间很长 并且由于该项目是由大量子项目构建的 而这些子项目无论如何都是由 Maven 构建的 因此需要很长时间才能使用
  • 将其元素添加到另一个列表后清除列表

    我正在做一个程序 它获取更多句子作为参数 我制作了 2 个列表 一个称为 propozitie 其中包含每个句子 另一个称为 propozitii 其中包含所有句子 问题是 当我在遇到 后清除 propozitie 列表时 它也会清除 pr

随机推荐

  • 如何模拟修改私有变量的私有方法?

    如何模拟修改私有变量的私有方法 class SomeClass private int one private int second public SomeClass public int calculateSomething comple
  • 如何获取对象当前的引用计数?

    我有一个指向 COM 对象的指针 在 C 中 有没有办法获取指针所指向的对象的当前引用计数 Call IUnknown AddRef然后立即IUnknown Release 后者返回的值是当前未完成引用的计数 请注意 该值不必准确 它仅供参
  • Jquery AJAX(json)跨域请求与ASP.NET MVC

    在我看来 这是一个被打败的主题 但我找不到答案 我发出 jquery ajax 请求 本地主机 666 来自本地主机 555 应用程序 ajax url http localhost 666 request dataType json ti
  • 如何从多个列表中查找最大值?

    我有多个相同大小的列表 或 numpy 数组 我想返回一个相同大小的数组 每个点都有最大值 例如 A 0 1 0 0 3 0 1 0 0 2 0 3 B 1 0 0 0 0 4 0 5 6 0 1 1 C numpy zeros like
  • 如何从 mySQL 和 PHP 检索结果作为多维数组?

    我刚刚开始学习更高级的 SQL 和 PHP 并且我真的很努力地尝试找出如何查询我的数据库以进行我正在构建的测验 最终 我尝试返回一个具有以下结构的 json 对象 该对象以多维数组的形式提供了问题列表和所有可能的答案 questions q
  • 如何使用c++获取Windows中的系统信息[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想用 C 代码获取我的系统硬件信息 那么如何用c 获取windows中的系统信息呢 您可以使用GetSystemInfo函数获取硬件信息 例如 OEM 标识符 处理器类型 页面
  • 我可以获得从 Scala 中的密封父级派生的所有 case 对象的编译时列表吗?

    正如在 SO 上多次讨论的那样 如果您没有详尽地列出从密封类派生的所有类型 Scala 匹配将会警告您 我想要的是从特定父级派生的案例对象的编译时生成的 Iterable 或者 我很高兴有一种方法可以让编译器告诉我我在某些 Iterable
  • 雷达图上的误差线?

    我正在寻找多变量数据的雷达图 这项任务对于 Excel 来说足够简单 当我还想在此绘制一些误差线时 问题就出现了 据我了解 我无法在Excel中做到这一点 这在 R 上可能吗 或者有人可以建议替代方案吗 我有 32 个单值维度 Thanks
  • 更新 mdb 数据库表

    我正在使用 NET Web Forms 和 mdb数据库作为数据源 问题是 我有一个工作后台 通过它我可以创建 修改和删除新页面 虽然我可以创建和删除 但编辑功能不起作用 我意识到问题可能出在查询中 因为代码对于其他功能运行良好 这是查询
  • C# 异步方法调用一直到 Main

    有人可以澄清这个例子 这当然是行不通的 class Program static void Main string args main cant be async int res test I must put await here Con
  • WPF DataGrid 列:如何管理值更改事件

    在我的 WPF C 项目中 我有一个 Datagrid 如下所示
  • MFMailComposeViewController 外观 setTintColor 迷失 iOS 7

    这个问题是针对运行 iOS 7 的 Xcode 5 的 非常奇怪 我试图将所有 UInavigation 和 UIBarButtonItem 文本颜色设置为白色 因此 在我的应用程序启动委托中 我将代码设置为 BOOL applicatio
  • Any 中的 Swift 转换失败?协议

    仅供参考 这里提出了 Swift 错误 https bugs swift org browse SR 3871 我遇到一个奇怪的问题 强制转换不起作用 但控制台将其显示为正确的类型 我有一个公共协议 public protocol MyPr
  • symfony make:新项目实体崩溃

    每当我尝试使用 bin console make entity 创建实体时 我都会得到以下结果 php bin console make entity Class name of the entity to create or update
  • 如何将 YUV 转换为 iOS 的 CIImage

    我正在尝试将 YUV 图像转换为 CIIMage 并最终转换为 UIImage 我在这些方面相当新手 并试图找出一种简单的方法来做到这一点 据我所知 从 iOS6 开始 YUV 可以直接用于创建 CIImage 但当我尝试创建它时 CIIm
  • 转义角括号的作用类似于前视

    为什么转义转义尖括号 gt 表现出类似前瞻的行为 需要明确的是 我知道尖括号不需要转义 问题是 如何解释该模式以产生所示的匹配项 match bracket with or without underscore replace with g
  • 如何使用 Mysql JDBC 驱动程序连接 Android 和 MySQL [重复]

    这个问题在这里已经有答案了 我想从 MySQL 中的表中获取数据并将其显示在 TextView 中 但是当我尝试连接数据库时遇到一些问题 我正在使用 Android 版 Eclipse 当我尝试从 Java 项目中的 MySQL 获取数据时
  • 我怎样才能制作如图所示的模态 - 不和谐

    我想在按下按钮时创建一个如图所示的模式 如何使用 Discord py 或 nextcord 制作此模型 您可以在此处找到 Nextcord 中的模态示例 https github com nextcord nextcord blob ma
  • 无窗口 .NET 应用程序中的全局热键

    我读过有关此问题的类似问题 包括在 C 中解决全局热键处理的最佳方法 and 使用C 设置全局热键 我还研究了 NuGet 包全局热键这似乎还处于起步阶段 这里的问题是 它们中的大多数似乎是为 Winforms 设计的 或者可能在 WPF
  • 调整窗口大小时 Java Swing 绘图消失

    我非常需要你的帮助 因为我自己无法解决这个问题 我正在尝试创建一个 GUI 并想在按下按钮后在其中绘制一些内容 但我似乎遇到某种刷新 重新验证或线程问题 绘图已绘制 但是当我调整窗口大小时 绘图消失了 此外 当快速移动窗口时 部分绘图会消失