java - 调整大小和最小化窗口时对象消失

标签 java java-2d

我需要一些有关此代码的帮助。 我已经具有绘制对象和从窗口中清除对象的功能,但是当我调整大小或最小化窗口时,如何才能使对象不会消失?

这是我目前的代码:

public class miClass implements ActionListener{
JFrame ventana;
JPanel panel;
JButton p,c;
Graphics g;
Image img;
Font font1,font2,font3;

public miClass(){
    ventana = new JFrame("Aplicacion.");
    p = new JButton("P");
    c = new JButton("C");
    panel = new JPanel();
    ventana.setLayout(null);
    ventana.setBounds(100,100,600,600);
    ventana.getContentPane().add(panel);
    ventana.add(p);
    p.addActionListener(this);
    c.addActionListener(this);
    p.setBounds(20,20,120,45);
    ventana.add(c);
    c.setBounds(200,20,120,45);
    ventana.setFocusable(true);
    ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ventana.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
    g = ventana.getGraphics();
    Toolkit tool = Toolkit.getDefaultToolkit();
    img = tool.getImage("prueba.png");
    g.drawImage(img,0,100,null);

    font1 = new Font("Helvetica",Font.PLAIN,22);
    g.setFont(font1);
    g.drawString("Hola", 100, 300);

    font2 = new Font("TimesRoman",Font.BOLD,20);
    g.setFont(font2);
    g.drawString("Mundo", 100, 340);

    font3 = new Font("Courier",Font.BOLD+Font.ITALIC,25);
    g.setFont(font3);
    g.drawString("WASAAAA!", 100, 400);

    g.setColor(Color.green);
    g.drawOval(300, 200, 150, 100);
    g.setColor(Color.red);
    g.drawArc(200, 400, 250, 64, 135, 46);
    g.setColor(Color.blue);
    g.drawLine(400, 200, 150, 100);
    g.setColor(Color.magenta);
    g.drawRect(300, 250, 160, 50);
    g.setColor(Color.cyan);
    g.fillRect(100,400,20,240);
    g.setColor(Color.lightGray);
    g.fillOval(100,340,14,30); 

    if(e.getSource() == c){ //Clean all objects on the window//
        g.clearRect(0,100,900,800);
    }
}

public static void main(String args[]){
    miClass GUI = new miClass();
}
}

最佳答案

调整大小时,您的框架将重置为其初始状态,并且您的代码仅在单击按钮时重新绘制它,而不是在调整大小时重新绘制它。调整父框架大小后,将调用 Component 的任何子类上的 PaintComponent 方法,因此您可以通过重写该方法来解决此问题。

package SO;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class miClass implements ActionListener {


  JFrame ventana;
  JPanel panel;
  JButton p, c;
  Graphics g;
  Image img;
  Font font1, font2, font3;

  public miClass() {
    ventana = new JFrame("Aplicacion.");
    p = new JButton("P");
    c = new JButton("C");
    panel = new JPanel() {
      @Override
      public void paintComponent(Graphics g) {
        // your stuff
        font1 = new Font("Helvetica", Font.PLAIN, 22);
        g.setFont(font1);
        g.drawString("THIS GETS REDRAWN", 100, 300);
      }
    };
    panel.setSize(400, 400);
    ventana.setLayout(null);
    ventana.setBounds(100, 100, 600, 600);
    ventana.getContentPane().add(panel);
    ventana.add(p);
    p.addActionListener(this);
    c.addActionListener(this);
    p.setBounds(20, 20, 120, 45);
    ventana.add(c);
    c.setBounds(200, 20, 120, 45);
    ventana.setFocusable(true);
    ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ventana.setVisible(true);
  }

  public void actionPerformed(ActionEvent e) {
    g = panel.getGraphics();
    Toolkit tool = Toolkit.getDefaultToolkit();
    img = tool.getImage("prueba.png");
    g.drawImage(img, 0, 100, null);

    font1 = new Font("Helvetica", Font.PLAIN, 22);
    g.setFont(font1);
    g.drawString("Hola", 100, 300);

    font2 = new Font("TimesRoman", Font.BOLD, 20);
    g.setFont(font2);
    g.drawString("Mundo", 100, 340);

    font3 = new Font("Courier", Font.BOLD + Font.ITALIC, 25);
    g.setFont(font3);
    g.drawString("WASAAAA!", 100, 400);

    g.setColor(Color.green);
    g.drawOval(300, 200, 150, 100);
    g.setColor(Color.red);
    g.drawArc(200, 400, 250, 64, 135, 46);
    g.setColor(Color.blue);
    g.drawLine(400, 200, 150, 100);
    g.setColor(Color.magenta);
    g.drawRect(300, 250, 160, 50);
    g.setColor(Color.cyan);
    g.fillRect(100, 400, 20, 240);
    g.setColor(Color.lightGray);
    g.fillOval(100, 340, 14, 30);

    if (e.getSource() == c) { // Clean all objects on the window//
      g.clearRect(0, 100, 900, 800);
    }
  }

  public static void main(String args[]) {
    miClass GUI = new miClass();
  }



}

关于java - 调整大小和最小化窗口时对象消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43771741/

相关文章:

java - Java cucumber 执行错误

java - elasticsearch java.library.pat 错误中没有 MeCab

java - 用什么替换 com.sun.image.codec.jpeg 类?

java - 获取 BufferedImage 所需的宽高比

java - 在 Java 中创建和绘制巨大的(缓冲的)图像

java - 为什么子 JComponent 没有调用 Paint(Graphics g)?

java - 在 Spring Boot 中使用 BCrypt 哈希函数而不需要过度的安全性?

java - 使用 Java 设置 App Engine 数据存储区的光标

java - 如何将复选框监听器与动态 JTable 一起使用?

java - Line2D 和 JComponent 交点和仿射变换