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

在JFrame上生成透明的JPanel

元英朗
2023-03-14

我是java图形新手,目前正在开发一款游戏。从本质上讲,有上升的泡沫,用户必须通过移动鼠标来弹出它们。

我已经在JFrame上制作了一个动画,我需要在上面为MouseMotionListener添加一个JPanel。然而,当我将JPanel添加到JFrame的顶部时(即使setOpaque设置为false),它仍然不能让我看到下面的动画。你可以在下面看到我的代码。如果你发现编码错误,请告诉我。

我考虑了两种解决方案,要么在JPanel中设置动画(我不知道怎么做),要么使JPanel透明。

游戏类别:

public class Game extends JPanel{

  public static final int WINDOW_WIDTH = 600;
  public static final int WINDOW_HEIGHT = 400;

  private boolean insideCircle = false;
  private static boolean ifPaused = false;
  private static JPanel mainPanel;
  private static JLabel statusbar;
  private static int clicks = 0;
  //Creates a Bubbles object Array
  Bubbles[] BubblesArray = new Bubbles[5];

  public Game() {

    //initializes bubble objects
     for (int i = 0; i < BubblesArray.length; i++)
       BubblesArray[i] = new Bubbles();
     }

public void paint(Graphics graphics) {

  //makes background white
   graphics.setColor(Color.WHITE);
   graphics.fillRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);

   //paints square objects to the screen
   for (Bubbles aBubblesArray : BubblesArray) {
     aBubblesArray.paint(graphics);
   }
}

public void update() {

 //calls the Square class update method on the square objects
 for (Bubbles aBubblesArray : BubblesArray) aBubblesArray.update();
}

    public static void main(String[] args) throws InterruptedException {
     statusbar = new JLabel("Default");
     mainPanel = new JPanel();
     mainPanel.setOpaque(false);
     mainPanel.setBackground(new Color(0,0,0,0));
     mainPanel.setVisible(true);
     mainPanel.addMouseMotionListener(new MouseAdapter() {
       @Override
        public void mouseMoved(MouseEvent e) {
          statusbar.setText(String.format("Your mouse is at %d, %d", e.getX(), e.getY()));
          }

       public void mouseExited(MouseEvent e){
         ifPaused = true;
        }   

        public void mouseEntered(MouseEvent e){
        ifPaused = false;
         }

     });

     Game game = new Game();
    JFrame frame = new JFrame();

    frame.add(game);
     frame.add(mainPanel);



   frame.add(statusbar, BorderLayout.SOUTH);
   frame.setVisible(true);
   frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
   frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
   frame.setTitle("Bubble Burst");
   frame.setResizable(false);
   frame.setLocationRelativeTo(null);

   while (true) {
      if (!ifPaused){
       game.update();
       game.repaint();
       Thread.sleep(5);
      }
   }
}    
}

共有1个答案

郑茂材
2023-03-14

您的游戏面板没有显示,因为您正在将两个组件添加到边界布局的同一位置(位于BorderLayout.CENTER)。因此,主面板不是添加在游戏的“顶部”,而是替换它。也就是说:

看起来你的主面板除了听鼠标运动之外,什么都没有做。你能不能把鼠标适配器添加到你的游戏对象中,因为它扩展了JPanel,如下所示:

game.addMouseMotionListener(new MouseAdapter() {
    @Override
    public void mouseMoved(MouseEvent e) {
        statusbar.setText(String.format("Your mouse is at %d, %d", e.getX(), e.getY()));
    }

    public void mouseExited(MouseEvent e){
        ifPaused = true;
    }   

    public void mouseEntered(MouseEvent e){
        ifPaused = false;
    }
});

 类似资料:
  • 问题内容: 如何使JFrame透明?我想使我的JFrame透明。当我的JFrame位于顶部时,用户应该会看到背景。 问题答案: 如果您对使用受限的API类没有异议,则可以使用该类的类和方法来实现。这里和这里是有关如何使用它的教程?而这里是使用Java本地接入的版本。 代码示例

  • 当我尝试重新绘制透明窗口并在其上绘制矩形时,之前的矩形将保留。目标是通过单击并移动鼠标在屏幕上选择一个区域。如果你移动鼠标一会儿,它会看起来像这样 通过去除透明度,效果很好。 我尝试了在Stack Overflow上找到的关于这个主题的所有内容,但我无法让它在Windows和Linux上运行。 谢谢:)

  • 我们有一个TextView,其中包含应用程序资源中的可抽屉-左和可抽屉-右。在一些设备上 运行Android 4.1.2的索尼Xperia L, 三星Galaxy Young或 三星Galaxy SII 我们正面临一个奇怪的问题。可拉拔件将显示为半透明/透明。在其他设备上,如 三星Galaxy S4(4.4.2)或 HTC ONE V(4.0.3) 可抽屉将正确显示。 这是布局定义的剪裁: 在HT

  • 我正在尝试移除(或者只是设置为不可见)我的JList的背景和边框。 当我在它上设置透明颜色时,我的JList背景保持白色。 这是我的自定义jcombox呈现器类: 我尝试在每个组件上放置和,但是没有好的结果。 一个解决方案是调整列表中图像的大小,但我的图像不是矩形的,所以列表背景的角是可见的。

  • 问题内容: 我正在使用下面的代码来显示图像,但是标签似乎有背景,这是我所不希望的。 和文件https://imgur.com/a/JR4Hc 问题答案: 这并不是说不能显示透明图像,而是标签具有自己的背景颜色,该背景颜色不透明或与其父对象相同。一种解决方法是将其父级的bg用作其自身的bg:

  • 我正在创建一个应用程序,在其中手动布局纹理图集。关键是图像本身不应该是透明的,因为它有一个一致的背景颜色,然后应该在代码中删除。 我遇到的问题是,我似乎无法从我正在处理的中删除像素,使其透明。我已经确保对我的格式使用,这肯定会支持透明性。 这是我遇到麻烦的一段代码: 很明显,即使从十六进制转换为十进制,也会是零。这是同一个数字! 根据我的观察,我注意到方法将一个像素绘制到当前像素上。我想要的是它变