Java:最小化Jframe窗口而不会导致程序再次运行

时间:2014-02-11 20:27:08

标签: java swing

我的程序使用Jframe,每当我最小化窗口并将其重新启动时,程序就会自动运行。我怎样才能使它在最小化时不这样做?

代码:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
import java.util.Random;

public class AB extends Component {
    public void paint(Graphics g) {
        Random r = new Random();
        g.setColor(Color.black);
        g.fillRect(r.nextInt(100), r.nextInt(100), 100, 100);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame("Load Image Sample");
        f.getContentPane().setBackground(Color.white);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        f.setSize(dim.width, dim.height);
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.add(new AB());
        f.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:2)

我的猜测:您的paint(...)paintComponent(...)方法覆盖中存在程序逻辑。如果是这样,请从这些方法中获取逻辑,因为当您发现时,您无法完全控制何时或甚至是否被调用。逻辑属于其他地方,可能在Swing Timer中,很难说没有代码或更详细的问题。

如果这没有帮助,那么您需要通过创建和发布minimal, runnable, example program向我们展示代码中的错误,并告诉我们您的程序的详细信息及其不当行为。< / p>


看了你的代码之后,我看到我的假设/猜测是正确的:你在paint方法中选择你的随机数,所以它们会随着每次重绘而改变。你会想要

  • 创建一个扩展JPanel的类。
  • 在此类的构造函数中创建随机数,并使用随机数设置类实例字段。
  • 覆盖此课程的paintComponent方法
  • 不要忘记在此方法中调用超级paintComponent方法。
  • 使用paintComponent方法覆盖中构造函数中生成的数字绘制矩形。
  • 将您的JPanel放入JFrame。

如,

import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.*;

@SuppressWarnings("serial")
public class RandomRect extends JPanel {
   private static final int MAX_INT = 100;
   private static final Color RECT_COLOR = Color.black;
   private Random random = new Random();
   private int randomX;
   private int randomY;

   public RandomRect() {
      randomX = random.nextInt(MAX_INT);
      randomY = random.nextInt(MAX_INT);
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.setColor(RECT_COLOR);
      g.fillRect(randomX, randomY, MAX_INT, MAX_INT);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("RandomRect");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new RandomRect());
      //frame.pack();
      // frame.setLocationRelativeTo(null);
      frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}