调整窗口大小时,Java Swing绘图消失 [英] Java Swing drawing disappears when resizing window

查看:187
本文介绍了调整窗口大小时,Java Swing绘图消失的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我非常需要你的帮助,因为我无法自己解决这个问题。
我正在尝试创建一个GUI,并希望在按下按钮后在其中绘制内容,但我似乎有某种刷新/重新验证或线程问题。绘图是绘制的,但是当我调整窗口大小时,绘画就会消失。此外,当快速移动窗口时,部分图形会消失。我尝试了很多东西,但是我无法解决这个问题,也许你可以帮助我。我被指示不要编写自己的代码,但是使用NetBeans设计函数生成按钮和面板等。这可能会损害绘图过程/功能,但我不知道。我会给你发贴相关的代码,非常感谢你的建议(已经说明的东西只是我之前尝试过的文物,所以不要介意):

i need your help badly because i cannot solve this problem on my own. I am trying to create a GUI and want to draw something in it after pressing a button, but i seem to have some kind of refresh/revalidate or threading issue. The drawing is painted, but when I resize the window, the painting disappears. Also, when moving the window very quickly, parts of the drawing disappear. I have tried many things, but I can't get this problem to work, maybe you can help me. I was instructed not to write my own code to begin with, but use the NetBeans Design functions to generate Buttons and Panels etc. Maybe this impairs the drawing process/functions, but I don't know. I'll post you the relevant code and would be very thankful for suggestions (the outcommented stuff are just artefacts from what I've tried before, so don't mind it):

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;
}

再次感谢您的宝贵时间。

Again thanks a lot for your precious time.

推荐答案

Java不记得为您绘制命令;单击按钮时,图形会呈现一次,因为这是调用 draw()的唯一时间。

Java doesn't remember drawing commands for you; your graphic is rendered once when you click the button because that's the only time when draw() is called.

如果要在调整大小后刷新渲染,请覆盖 paint(Graphics)并在其中调用 draw()

If you want to refresh the rendering after a resize, override paint(Graphics) and call draw() in there.

如果这与按钮点击有关,则必须在课程中添加字段,在其中记住 draw()<中所需的所有内容/ code>包括它是否应该绘制任何东西的事实:

If that is related to the button click, you must add fields to your class in which you remember everything that you need in draw() including the fact whether it should draw anything:

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();
  ...
}

进一步阅读:

  • Lesson: Performing Custom Painting
  • Painting in AWT and Swing

这篇关于调整窗口大小时,Java Swing绘图消失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆