我制作了一个简单的程序,使用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);
}
}
答案 0 :(得分:1)
您从不想要明确调用paintComponent
。相反,如果您想要重新绘制面板,可以致电panel.repaint()
,并且面板会隐式为您调用自己的paintComponent
方法。
不要在main
方法中执行所有操作,您会发现使用static
引用会遇到很多问题。
不要使用Thread.sleep()
,它会阻止Event Dispatch Thread。,因为你应该在那里运行Swing应用程序。而是使用java.swing.Timer
。有关Timer
用法,请参阅this example。
如3中所述,从EDT运行你的Swing应用程序
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new MyApp();
}
});
}
不要设置框架的大小。而是覆盖getPreferredSize()
的{{1}}和DrawingPanel
框架。
您可以使用pack()
习惯使用@Override注释来确保正确覆盖。
附加到2.你习惯做什么,是从构造函数做你的工作,然后只是调用setLocationRelativeTo(null)
中的构造函数。这是您的代码的重构,修复了上述所有内容。你可以运行它。
main