gpt4 book ai didi

java - 有透明背景吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:21 25 4
gpt4 key购买 nike

所以,我正在尝试制作这个简单的类似绘画的程序,到目前为止它非常成功,但我遇到了这个问题。当我运行应用程序时,背景是透明的,并且它呈现屏幕,除了一切正常之外。另外,如果我使用 super.paint(); ,屏幕开始闪烁,这可不是什么好事。我目前正在使用 eclipse,遵循教程,并且这个家伙似乎一切都工作得很好。我也是一个绝对的初学者,所以请耐心听我解释一切,因为我现在才学习 Java 三天。

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、内容 Pane 、玻璃 Pane ...所有这些都可能会覆盖您要绘制的内容。

此外,直接在框架上绘画可以让您在框架的装饰下绘画,这并不是您真正想要做的...

例如(为什么它不好)...

如何获得屏幕的精确中间位置,即使在调整大小时也是如此我怎样才能设置在中间呢?Java AWT drawString() 不显示在窗口上解决方案...

创建一个从 JPanel 等扩展的自定义类,并覆盖它的 PaintComponent 方法并在那里执行自定义绘画。您免费获得双缓冲支持,并且不再需要担心框架的边框,因为内容 Pane 将确保它与框架内部的装饰一起维护。

有关更多详细信息,请参阅 AWT 和 Swing 中的绘画以及执行自定义绘画

此外,在设置框架大小之前调用 setRessized,这会更改框架装饰的大小,并可能在框架内容区域内产生意外的额外间距...

第三个......

最后我将分享一个代码,它确实可以帮助您更好地了解您所问的问题

    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);

}

}

关于java - 有透明背景吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38148592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com