gpt4 book ai didi

java - 为什么这个 JPanel 不可见?

转载 作者:行者123 更新时间:2023-12-02 03:27:42 27 4
gpt4 key购买 nike

我有一个自定义 JPanel,位于另一个自定义 JPanel 后面,位于 JLayeredPane 中。我只想绘制一次背景 JPanel 。因为它没有改变。这将节省系统资源。我怎样才能成功做到这一点?

我知道如果我允许后台 JPanel 像前台 JPanel 一样重复绘制,它就会被看到。但这无视我的目标。即只绘制一次。

重申一下。如何绘制一次背景 JPanel,并递归绘制前景 JPanel,同时在 JLayeredPane 中看到两个 JPanel,其中背景 JPanel 位于前景 JPanel 的后面

这是我目前的尝试。这是行不通的。此代码的问题是背景 JPanel 根本不可见`

这个问题不是重复的,因为人们正在解决不相关的问题。我现在提出这个问题来解决我想要解决的问题。如果能帮助你解决我的问题。那么问题的链接就在这里。 question 。这个问题也有一个糟糕的、毫无意义的答案。我什至仍在尝试并且没有工作。

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class Main extends JLayeredPane {
static JFrame frame;
static Main main;
static Dimension screenSize;
public Main() {
JPanel backPanel = new BackPanel();
JPanel frontPanel = new FrontPanel();
add(backPanel, new Integer(7));
add(frontPanel, new Integer(8));

new Thread(() -> {
while (true){
repaint();
}
}).start();

RepaintManager.currentManager(backPanel).markCompletelyClean(backPanel);

}

public static void main(String[] args) {
screenSize = Toolkit.getDefaultToolkit().getScreenSize();

frame = new JFrame("Game"); // Just use the constructor

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

main = new Main();
frame.add(main, BorderLayout.CENTER);

frame.pack();
frame.setSize(screenSize);
frame.setLocationRelativeTo(null);
frame.setVisible(true);



}
public class BackPanel extends JPanel{
public boolean drawn = false;
public BackPanel(){
setVisible(true);
setOpaque(false);
setSize(screenSize);
JLabel test1 = new JLabel("Test1");
JLabel test2 = new JLabel("Test2");
add(test1);
add(test2);
}
@Override
public void paintComponent(Graphics g){
if (!drawn){
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(0, 0, screenSize.width, 200);
System.out.println("Reccursion");
drawn = true;
}
}
}
public class FrontPanel extends JPanel{

public FrontPanel(){
setVisible(true);
setOpaque(false);
setSize(screenSize);
JLabel test = new JLabel("Test");
add(test);
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.blue);
g.fillRect(0+screenSize.width/2, 0, screenSize.width/4, 300);
}
}
}

最佳答案

首先是一些一般性评论。你不应该:

  1. 扩展 JLayeredPane。
  2. 使用静态变量
  3. 使用 while true 循环

这是否是 MCVE 并不重要。 MCVE 应使用正确的结构,否则我们可能会认为您在实际代码中犯了上述错误。

在 while 循环中使用:

repaint();

好吧,您的代码扩展了 JLayeredPane,以便绘制分层 Pane 的所有层。

如果您只想重绘一个面板,则仅在该面板上调用 repaint()。然而,这可能会导致问题,因为您需要确保在对其进行任何绘制之前清除背景,这就是背景也需要绘制的原因。

如果您不想重新绘制整个背景,那么您需要具体说明哪些区域需要重新绘制。查看 Swing 教程中关于 Custom Painting 的部分这展示了如何优化所绘制的内容。请注意 moveSquare(...) 方法如何在两个不同区域调用 repaint() 两次。这将导致重新绘制较小的背景区域。

关于java - 为什么这个 JPanel 不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38593769/

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