JPanel造成额外的空间?

时间:2014-02-04 20:25:32

标签: java swing while-loop jpanel delay

我制作了一个简单的程序,使用drawString()在JPanel上绘制,重新绘制后将背景更改为随机颜色。它工作得很好,除了JPanel的右侧和底侧的~10像素空间,它们仍然是默认颜色。我认为这个问题可能会发生,因为我使用pack()getPrefferedSize()的方式。任何帮助或建议,以解决这个问题。

Birthday.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;

public class Birthday {

    DrawString panel = new DrawString();

    public Birthday() {
        JFrame f = new JFrame();

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(panel);
        f.setTitle("Happy Birthday!");
        f.setLocation(10, 10);
        f.pack();

        f.setVisible(true);
        f.setResizable(false);

        Timer timer = new Timer(500, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                panel.repaint();
            }
        });
        timer.start();
    }

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

            @Override
            public void run() {
                new Birthday();
            }
        });
    }
}

DrawString.java

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JPanel;

public class DrawString extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        int width = getWidth();
        int height = getHeight();

        int x = 350;
        int y = 250;
        int red   = random(0,255);
        int green = random(0,255);
        int blue  = random(0,255);
        Color black = new Color(0,0,0);

        Color newColor = new Color(red,green,blue);
        g.setColor(newColor);
        g.fillRect(0,0,1000,500);
        g.setColor(black);
        g.setFont(new Font(null,Font.BOLD,40));
        g.drawString("Happy Birthday!",x,y);
    }

    public static int random(int min, int max)
    {
        int range = max - min + 1;
        int number = (int) (range * Math.random() + min);
        return number;
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(1000, 500);
    }
}

1 个答案:

答案 0 :(得分:1)

  1. 从不想要明确调用paintComponent。相反,如果您想要重新绘制面板,可以致电panel.repaint(),并且面板会隐式为您调用自己的paintComponent方法。

  2. 不要在main方法中执行所有操作,您会发现使用static引用会遇到很多问题。

  3. 不要使用Thread.sleep(),它会阻止Event Dispatch Thread。,因为你应该在那里运行Swing应用程序。而是使用java.swing.Timer。有关Timer用法,请参阅this example

  4. 如3中所述,从EDT运行你的Swing应用程序

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new MyApp();
            }
        });
    }
    
  5. 不要设置框架的大小。而是覆盖getPreferredSize()的{​​{1}}和DrawingPanel框架。

  6. 您可以使用pack()

  7. 使框架居中
  8. 习惯使用@Override注释来确保正确覆盖。


  9. 附加到2.你习惯做什么,是从构造函数做你的工作,然后只是调用setLocationRelativeTo(null)中的构造函数。这是您的代码的重构,修复了上述所有内容。你可以运行它。

    main