有透明背景吗?
Have a transparent background?
所以,我正在尝试制作这个简单的类似绘画的程序,到目前为止它一直很成功,但我有一个问题。当我 运行 应用程序时,背景是透明的,并且呈现屏幕,除此之外一切正常。另外,如果我使用 super.paint(); ,屏幕开始闪烁,闪烁,这不是什么好事。我目前正在使用 eclipse,遵循教程,这个人似乎一切正常。我也是一个绝对的初学者,所以请耐心等待并解释一切,因为我现在才学习 Java 3 天。
package JavaMain;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
public class javamain extends JFrame {
int x, y;
private static final long serialVersionUID = 1L;
private class AL extends KeyAdapter {
private int keycode;
@SuppressWarnings("static-access")
public void keyPressed(KeyEvent event) {
keycode = event.getKeyCode();
if (keycode == event.VK_LEFT) {
x--;
}
if (keycode == event.VK_RIGHT) {
x++;
}
if (keycode == event.VK_UP) {
y--;
}
if (keycode == event.VK_DOWN) {
y++;
}
}
public void keyReleased(KeyEvent e) {}
}
public javamain() {
addKeyListener(new AL());
setTitle("Statistic");
setSize(600, 800);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x = 200;
y = 200;
}
public void paint(Graphics g) {
g.fillRect(x, y, 2, 2);
repaint();
}
public static void main(String[] args) {
new javamain();
}
}
首先...
你正在打破油漆链...
public void paint (Graphics g)
{
// You MUST call super.paint here...
g.drawString("Hello World!", 250, 250);
}
第二
您应该不惜一切代价避免覆盖顶级容器(如 JFrame)的绘制。原因有很多,其中一个您刚刚发现,还因为顶级容器不是双缓冲的,这会在绘制时引入闪烁,并且 JFrame 包含一堆其他组件,JRootPane、内容窗格、玻璃窗格。 ..所有这些都可以覆盖您正在尝试绘制的内容。
此外,直接在框架上绘画允许您在框架的装饰下绘画,这并不是您真正想要做的...
例如(为什么不好)...
即使重新调整大小时,如何获得屏幕的精确中间
我怎样才能设置在中间?
Java AWT drawString() 在 window 上不显示
解决方案...
创建自定义 class 从 JPanel 之类的东西扩展并重写它的 paintComponent 方法并在那里执行自定义绘画。您免费获得双缓冲支持,不再需要担心框架的边框,因为内容窗格将确保它在框架装饰内部得到维护。
有关详细信息,请参阅 AWT 和 Swing 中的绘画以及执行自定义绘画
此外,在设置框架大小之前调用 setResizable,这会改变框架装饰的大小,并可能在框架内容区域内产生意想不到的额外间距...
第三....
最后我将分享一个代码,它可以真正帮助您更好地了解您的问题
public class Main extends JPanel implements KeyListener
{
private Point startPoint = new Point(0, 0);
private Point endPoint = new Point(0, 0);
public Main()
{
addKeyListener(this);
}
public void keyPressed(KeyEvent evt)
{
int keyCode = evt.getKeyCode();
int d;
if (evt.isShiftDown())
d = 5;
else
d = 1;
if (keyCode == KeyEvent.VK_LEFT)
add(-d, 0);
else if (keyCode == KeyEvent.VK_RIGHT)
add(d, 0);
else if (keyCode == KeyEvent.VK_UP)
add(0, -d);
else if (keyCode == KeyEvent.VK_DOWN)
add(0, d);
}
public void keyReleased(KeyEvent evt)
{
}
public void keyTyped(KeyEvent evt)
{
}
public boolean isFocusTraversable()
{
return true;
}
public void add(int dx, int dy)
{
endPoint.x += dx;
endPoint.y += dy;
Graphics g = getGraphics();
g.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
g.dispose();
startPoint.x = endPoint.x;
startPoint.y = endPoint.y;
}
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setTitle("Sketch");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.add(new Main());
frame.setVisible(true);
}
}
所以,我正在尝试制作这个简单的类似绘画的程序,到目前为止它一直很成功,但我有一个问题。当我 运行 应用程序时,背景是透明的,并且呈现屏幕,除此之外一切正常。另外,如果我使用 super.paint(); ,屏幕开始闪烁,闪烁,这不是什么好事。我目前正在使用 eclipse,遵循教程,这个人似乎一切正常。我也是一个绝对的初学者,所以请耐心等待并解释一切,因为我现在才学习 Java 3 天。
package JavaMain;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
public class javamain extends JFrame {
int x, y;
private static final long serialVersionUID = 1L;
private class AL extends KeyAdapter {
private int keycode;
@SuppressWarnings("static-access")
public void keyPressed(KeyEvent event) {
keycode = event.getKeyCode();
if (keycode == event.VK_LEFT) {
x--;
}
if (keycode == event.VK_RIGHT) {
x++;
}
if (keycode == event.VK_UP) {
y--;
}
if (keycode == event.VK_DOWN) {
y++;
}
}
public void keyReleased(KeyEvent e) {}
}
public javamain() {
addKeyListener(new AL());
setTitle("Statistic");
setSize(600, 800);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x = 200;
y = 200;
}
public void paint(Graphics g) {
g.fillRect(x, y, 2, 2);
repaint();
}
public static void main(String[] args) {
new javamain();
}
}
首先...
你正在打破油漆链...
public void paint (Graphics g)
{
// You MUST call super.paint here...
g.drawString("Hello World!", 250, 250);
}
第二
您应该不惜一切代价避免覆盖顶级容器(如 JFrame)的绘制。原因有很多,其中一个您刚刚发现,还因为顶级容器不是双缓冲的,这会在绘制时引入闪烁,并且 JFrame 包含一堆其他组件,JRootPane、内容窗格、玻璃窗格。 ..所有这些都可以覆盖您正在尝试绘制的内容。
此外,直接在框架上绘画允许您在框架的装饰下绘画,这并不是您真正想要做的...
例如(为什么不好)...
即使重新调整大小时,如何获得屏幕的精确中间 我怎样才能设置在中间? Java AWT drawString() 在 window 上不显示 解决方案...
创建自定义 class 从 JPanel 之类的东西扩展并重写它的 paintComponent 方法并在那里执行自定义绘画。您免费获得双缓冲支持,不再需要担心框架的边框,因为内容窗格将确保它在框架装饰内部得到维护。
有关详细信息,请参阅 AWT 和 Swing 中的绘画以及执行自定义绘画
此外,在设置框架大小之前调用 setResizable,这会改变框架装饰的大小,并可能在框架内容区域内产生意想不到的额外间距...
第三....
最后我将分享一个代码,它可以真正帮助您更好地了解您的问题
public class Main extends JPanel implements KeyListener
{
private Point startPoint = new Point(0, 0);
private Point endPoint = new Point(0, 0);
public Main()
{
addKeyListener(this);
}
public void keyPressed(KeyEvent evt)
{
int keyCode = evt.getKeyCode();
int d;
if (evt.isShiftDown())
d = 5;
else
d = 1;
if (keyCode == KeyEvent.VK_LEFT)
add(-d, 0);
else if (keyCode == KeyEvent.VK_RIGHT)
add(d, 0);
else if (keyCode == KeyEvent.VK_UP)
add(0, -d);
else if (keyCode == KeyEvent.VK_DOWN)
add(0, d);
}
public void keyReleased(KeyEvent evt)
{
}
public void keyTyped(KeyEvent evt)
{
}
public boolean isFocusTraversable()
{
return true;
}
public void add(int dx, int dy)
{
endPoint.x += dx;
endPoint.y += dy;
Graphics g = getGraphics();
g.drawLine(startPoint.x, startPoint.y, endPoint.x, endPoint.y);
g.dispose();
startPoint.x = endPoint.x;
startPoint.y = endPoint.y;
}
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setTitle("Sketch");
frame.setSize(300, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.add(new Main());
frame.setVisible(true);
}
}