调整窗口大小时 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 绘图消失 的相关文章

随机推荐

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

    如何模拟修改私有变量的私有方法 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 并想在按下按钮后在其中绘制一些内容 但我似乎遇到某种刷新 重新验证或线程问题 绘图已绘制 但是当我调整窗口大小时 绘图消失了 此外 当快速移动窗口时 部分绘图会消失