gpt4 book ai didi

java - 在其他物体前面 Swing 物体

转载 作者:行者123 更新时间:2023-12-01 22:33:13 25 4
gpt4 key购买 nike

我听说 swing 默认情况下是双缓冲的。我不想让 Swing 双缓冲。我正在使用双缓冲,我想添加一些 Swing 对象(现在只是添加到 JPanel 中的 JButton,然后再添加到 JFrame 中)。

问题是在渲染其他内容后调用框架的paint、repaint或paintComponents方法会删除其他内容的视觉效果。在渲染其他内容之前调用方法会导致其他内容位于 Swing 对象(现在只是一个 JButton)前面。直接对 JPanel 执行相同操作似乎没有效果。

我相信我需要一种方法来绘制 Jframe 或添加到其中的 JPanel,而无需其默认背景(灰色),这会导致窗口在设置为 Color(0,0,0,0) 时变为空白。

public void paint() {
// uses double buffering system.
do {
do {
Graphics2D g2d = (Graphics2D) bufferStrategy.getDrawGraphics();
g2d.fillRect(0, 0, frame.getWidth(), frame.getHeight());
try {// frame.paintComponents(g2d); // calling it here draws buttons to behind of the object
rendering(g2d); // I draw other objects in this method
// frame.paintComponents(g2d);// calling it here makes other objects disappear

} catch (NullPointerException e) {
e.printStackTrace();
}
g2d.dispose();
} while (bufferStrategy.contentsRestored());
bufferStrategy.show();
} while (bufferStrategy.contentsLost());
}// method end

这就是我设置按钮的方式:

private void setUpGUI() {
panel = new JPanel();

LayoutManager layout = new FlowLayout();
panel.setLayout(layout);
panel.setOpaque(false);//this does not seems to have any effect
panel.setBackground(Color.yellow);//this does not seems to have any effect. this is just for testing

JButton but1 = new JButton("but1");

panel.add("but1", but1);
frame.add(panel);

}

编辑:这是解决方法/修复:

新的绘制方法:

public void paint() {
// uses double buffering system.
do {
do {
Graphics2D g2d = (Graphics2D) bufferStrategy.getDrawGraphics();
g2d.fillRect(0, 0, frame.getWidth(), frame.getHeight());
try {
frame.paint(g2d);

} catch (NullPointerException e) {
e.printStackTrace();
}
g2d.dispose();
} while (bufferStrategy.contentsRestored());
bufferStrategy.show();
} while (bufferStrategy.contentsLost());
}// method end

我已经重写了面板的绘制方法:

    @Override
public void paint(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Main.main().rendering(g2d);

super.paint(g);
g.dispose();
g2d.dispose();
}
}

最佳答案

无需创建自己的 BufferStategy!!!

如果您想进行自定义绘制,请覆盖 JPanel 的 PaintComponent() 方法,然后将面板添加到框架中。阅读 Swing 教程中关于 Custom Painting 的部分了解更多信息和示例。

然后,您仍然可以像添加任何其他面板一样向该面板添加组件。面板的布局管理器将定位组件。

panel.setOpaque(false);
panel.setBackground(Color.yellow);

setBackground(...) 什么都不做,因为你说面板不是不透明的,这意味着父组件的背景将被绘制。

 panel.add("but1", but1);

这不是向面板添加组件的方式。正确的使用方法是:

panel.add(but1);

由于您的面板使用 FlowLayout,因此无需指定约束。

关于java - 在其他物体前面 Swing 物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275323/

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