当前位置: 首页 > 知识库问答 >
问题:

如何在没有背景的情况下绘制JPanel的组件?

尹英华
2023-03-14

所以我有一个扩展JPanel的“GameCourt”类。这个类覆盖paintComponent代码,以便绘制一些组件(迷宫、字符和一些硬币)。这个JPanel是扩展JLayeredPane的类的一部分,它有两层,一层用于绘制背景(使用扩展JPanel的BackgroundPanel类),另一层用于绘制我想要的所有元素(一个重置按钮,一个标签..)

所以我想要的是JLayeredPane中背景上方的GameCourt不要绘制它的背景,这样我就可以查看美丽的图像。

我在GameCourt中尝试了setOpaque(false),但它只显示背景。

我尝试改变JLayeredPane中背景的索引,使其位于he GameCourt(JPanel)之上,但这并没有什么不同。(这很奇怪,因为它至少应该在GameCourt JPanel上方绘制背景。

此外,我尝试执行:add(背景,新整数(0)),就像JavaDocs中的示例代码一样,但它说“非法参数异常”。

我真的不知道出了什么问题...我想我误解了JLayeredPane代码,因为当我使用setOpaque(false)但没有将背景添加到JLayeredPane时,它会正确地显示所有内容。另外,将add(背景,0)改为add(背景,2)怎么会没有影响??

 public class GameCourt extends JPanel {

 public GameCourt(JLabel status) {

 //     setOpaque(false);    
    setBackground(new Color(0,0,0,0));
 // Game constants
public static final int COURT_WIDTH = 1275;
public static final int COURT_HEIGHT = 765;
}

/**
 * (Re-)set the game to its initial state.
 */
public void reset() {
    playing = true;
    status.setText("Running...");

    // Make sure that this component has the keyboard focus
    requestFocusInWindow();
}

/**
 * This method is called every time the timer defined in the constructor
 * triggers.
 */
private void tick() {
    if (playing) {
        repaint();
    }
}
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    m.drawMaze(g);
    player.draw(g);
    coins.drawCoins(g);
}

@Override
public Dimension getPreferredSize() {
    return new Dimension(COURT_WIDTH, COURT_HEIGHT);
}
}
public class LayeredGameCourt extends JLayeredPane {

package Game;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class LayeredGameCourt extends JLayeredPane {


    private GameCourt court;
    public LayeredGameCourt()    {

        setPreferredSize(new Dimension(GameCourt.COURT_WIDTH, GameCourt.COURT_HEIGHT+90));
        setLayout(new BorderLayout());

        final JBackgroundPanel background = new JBackgroundPanel();
        add(background,0);
        background.setBounds(0,0,GameCourt.COURT_WIDTH,GameCourt.COURT_HEIGHT+90);

        // Status panel
        final JLabel status = new JLabel("Running...");

        // Main playing area
        final GameCourt court = new GameCourt(status);
        this.court=court;
        add(court, 1);
        court.setBounds(0,90,GameCourt.COURT_WIDTH,GameCourt.COURT_HEIGHT);

        // Reset button
        final JPanel control_panel = new JPanel();
        add(control_panel, 1);


        final JButton reset = new JButton("Reset");
        reset.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                court.reset();
            }
        });
        control_panel.add(status);
        control_panel.add(reset);
        // Start game
        court.reset();
    }

    public void requestFocusForGC(){
        court.requestFocusInWindow();
    }

    }
@SuppressWarnings("serial")
public class JBackgroundPanel extends JPanel {

    private BufferedImage background;
    public JBackgroundPanel() {
        try {
            if (background == null) {
                background = ImageIO.read(new File("background.png"));
            }
        } catch (IOException e) {
            System.out.println("Internal Error:" + e.getMessage());
        } 
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(background, 0, 0,null);  
        System.out.println("attempting to paint");
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(GameCourt.COURT_WIDTH, GameCourt.COURT_HEIGHT+90);
    }
}

共有1个答案

曹伟泽
2023-03-14

不要紧,让它起作用!

对于其他可能有同样问题的人来说。以下是我的思维过程。

为什么我不能做加法(背景,新整数(0))?

为了澄清:这是我删除的一行:

setLayout(new BorderLayout());

谢谢任何想帮忙的人!

 类似资料:
  • 问题内容: 我如何告诉paint方法仅在JPanel上而不是在整个JFrame上绘制背景。我的JFrame大小大于JPanel。当我尝试为JPanel绘制网格背景时,网格似乎遍及整个JFrame,而不仅仅是JPanel。 以下是部分代码: 问题答案: camickr是正确的。所以: 您需要严格将工程图与不同组件分开。Swing已经在管理子组件,因此绝对不需要在Panel的Frame中实现图形(调用

  • 我正在制作应用程序与视频播放器在它和我的整个结构是为只有肖像视图,除了这个视频播放器。我只想为这个视图启用景观旋转。但是我在很多论坛上做了很多文章,每一篇文章都是为了给App Delegate添加一些代码,但是我没有。那我能做什么。

  • 我有一个程序,有多个层次,在底层我有一个JPanel,我把背景图像放在上面。除此之外,我还有一个JLayeredPane,其中包含一些可拖动的组件。我的问题是,当用户上传了背景图像时,可拖动的组件确实滞后了,我猜这是因为swing在拖动时一直在重新绘制背景图像。我的问题是,如果它无论如何,以确保图像没有重新绘制的所有时间?我在其中绘制图像的代码如下所示:

  • 我想知道如何使背景渐变,这是在另一个J面板。在互联网上找到了许多文章,但他们都演示了如何覆盖J面板的画质组件(),而不是如何为它里面的j面板做。 我使用Netbean IDE。我创建了一个新的J面板类,可以覆盖它的画质组件()。我在上面有另一个j面板(拖 这是我为父母尝试的方式。成功了。我怎样才能为子 jpanel 覆盖它?

  • 问题内容: 在Java中,是否可以制作一个跳过背景,使其背景透明(除了上面的组件之外)是透明的? 问题答案: 它会将绘画背景传递给其父级,后者可能会绘制自己的背景。 您可以进行屏幕捕获,然后使用它来绘制面板的背景。

  • 问题内容: 我正在尝试设置spring xml配置,而不必创建进一步的。但是,即使我将数据库属性包括在 spring.xml: 我在这里想念什么? 问题答案: 在entityManagerFactory bean定义中指定“ packagesToScan”和“ persistenceUnitName”属性。 请注意,这适用于Spring版本> 3.1