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

我如何删除白色背景,我如何添加一根棍子?

许远航
2023-03-14

我正在尝试为我的项目创建一个台球游戏,我很难同时添加棍子和球。此外,当我添加球时,JFrame的背景变成白色,它实际上应该是绿色(桌子的颜色)。

非常感谢你的帮助。

我试着使用图形。例如g2d。挫折背景(颜色.绿色)。这不管用

public class Practice_Window implements MouseListener, MouseMotionListener, KeyListener {

    JFrame Practice_Mode = new JFrame(); 
    Balls myBalls = new Balls(); 
    Stick myStick = new Stick(); 

    public void PracticeWindow()
    {

        Practice_Mode.setSize(1000, 500);
        Practice_Mode.setVisible(true); 
        Practice_Mode.setResizable(false);
        Practice_Mode.setTitle("Practice Mode");
        Practice_Mode.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Practice_Mode.getContentPane().setBackground(new Color(0, 1, 0, 0.5f)); //Not visible after i add my balls
        Practice_Mode.getRootPane().setBorder(BorderFactory.createMatteBorder(10, 10, 10, 10, Color.GREEN));

        Practice_Mode.add(myBalls);
        //Practice_Mode.add(myStick); 

        //JPanel p = new JPanel();

        //Timer t= new Timer(10, myBalls); 


    }
//BALL CLASS
public class Balls extends JPanel implements ActionListener
{
    double Size = 35;

    double REDxSpeed = 5; 
    double REDySpeed = 5;
    double REDSpeed = 0;


    double YELLOWxSpeed = 2; 
    double YELLOWySpeed = 3; 
    double YELLOWSpeed = 0;


    double WHITExSpeed = 4; 
    double WHITEySpeed = 2; 
    double WHITESpeed = 0;

    double friction = 0.2; 

    boolean Collision = false; 

    Ellipse2D.Double red = new Ellipse2D.Double(200, 200, Size, Size);
    Ellipse2D.Double yellow = new Ellipse2D.Double(300, 300, Size, Size); 
    Ellipse2D.Double white = new Ellipse2D.Double(150, 400, Size, Size);

    Timer t = new Timer(10, this); 


    Balls()
    {
        t.start(); 
    }

    @Override
    public void actionPerformed(ActionEvent e) //Things are moving here
    {

        //RED BALL
        red.x += REDxSpeed; 
        red.y += REDySpeed; 
        REDSpeed = Math.sqrt(REDxSpeed*REDxSpeed + REDySpeed*REDySpeed); 

        repaint(); 

        if(red.x < 0 || red.x > getWidth() - red.width)
        {
            REDxSpeed = -REDxSpeed; 
        }

        if(red.y < 0 || red.y > getHeight() - red.height)
        {
            REDySpeed = -REDySpeed; 
        }

        //YELLOW BALL
        yellow.x += YELLOWxSpeed; 
        yellow.y += YELLOWySpeed; 
        YELLOWSpeed = Math.sqrt(YELLOWxSpeed*YELLOWxSpeed + YELLOWySpeed*YELLOWySpeed); 

        repaint(); 

        if(yellow.x < 0 || yellow.x > getWidth() - yellow.width)
        {
            YELLOWxSpeed = -YELLOWxSpeed; 
        }

        if(yellow.y < 0 || yellow.y > getHeight() - yellow.height)
        {
            YELLOWySpeed = -YELLOWySpeed; 
        }

        //WHITE BALL
        white.x += WHITExSpeed; 
        white.y += WHITEySpeed; 
        WHITESpeed = Math.sqrt(WHITExSpeed*WHITExSpeed + WHITESpeed*WHITEySpeed);
        repaint(); 

        if(white.x < 0 || white.x > getWidth() - white.width)
        {
            WHITExSpeed = -WHITExSpeed; 
        }

        if(white.y < 0 || white.y > getHeight() - white.height)
        {
            WHITEySpeed = -WHITEySpeed; 
        }
        Collision_Detection(); 
    }

    public void paintComponent(Graphics g) //DRAWING MY BALLS
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g; 
        //g2d.setBackground(Color.green);

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.red);
        g2d.fill(red);

        g2d.setColor(Color.yellow);
        g2d.fill(yellow);

        g2d.setColor(Color.black);
        g2d.fill(white);
    }
//STICK CLASS
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;

import javax.swing.*; 

public class Stick extends JPanel implements MouseListener, MouseMotionListener, ActionListener {
    int xLocation = 50; 
    int yLocation = 50; 
    int Width = 50;  
    int Height = 15;

    Rectangle2D.Double stick = new Rectangle2D.Double(200, 200, Width, Height); 

    Timer t = new Timer(10, this); 

    Stick()
    {
        t.start();
    }

    public void PaintComponent(Graphics g)
    {
        super.paintComponent(g); 
        Graphics2D g2d = (Graphics2D)g; 

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);


        g2d.setColor(Color.ORANGE);
        g2d.fill(stick);

    }

共有2个答案

黄彬
2023-03-14

你的棍子和球正在扩展JPanel,它通常被用作一个容器,将一组JComponents,它们是按钮和UI元素。你看到的图形错误很可能是Java试图使用默认的边框布局将面板并排排列,因为它认为当你试图实现自由形状时,你需要按钮和其他东西的面板。

更好的方法是在JPanel上将棍子和球渲染为原始形状,而不是JPanel本身。这是通过让他们实现Shape或至少给他们draw方法来实现的;原语教程很有用。这个问题也有人和你的处境相似,并且有与你相关的答案。

勾长卿
2023-03-14

我很难同时添加球杆和球。

那么,为什么你试图一次编写整个应用程序,而不在过程中做任何测试呢?为什么你在代码中有定时器?为什么你有KeyListeners?

学习一步一步地开发应用程序。写一点代码做一些测试。当它工作时添加更多的功能。在添加更复杂的逻辑之前先获得基本的权利。

Practice_Mode.add(myBalls);
//Practice_Mode.add(myStick); 

JFrame的默认布局管理器是BorderLayout。默认情况下,将零部件添加到框架(且不指定约束)时,零部件将移到中心。只有一个组件可以添加到中心,因此只有最后添加的组件才可见。

你的基本设计是错误的。你不想让球和棍子有单独的面板。您希望有一个“台球游戏板”面板,可以绘制多个对象。所以这个面板会画所有的球和棍子。这样,所有对象都由同一个类管理。

您也不应该创建具有变量名的单个对象。这限制了您可以控制的对象数量。相反,将您想要绘制的对象保留在ArrayList中,然后绘制方法遍历ArrayList并绘制每个对象。

请参阅:获取类外JPanel的宽度和高度,以获取此方法的工作示例。

我添加球JFrame的背景变成白色,

Practice_Mode.getContentPane().setBackground(new Color(0, 1, 0, 0.5f)); 

指定颜色时不要使用alpha值。对于绿色,您可以使用:

practiceMode.getContentPane().setBackground( Color.GREEN );
 类似资料:
  • 我正在将PNG转换为JPG。透明背景默认变为黑色。我需要它是白色的。

  • 问题内容: 在SO和Web上,我都经常看到这个问题。但是它们都不是我要找的东西。 如何仅使用CSS将颜色叠加层添加到背景图像? HTML示例: CSS示例: 请注意: 我想仅通过使用CSS来解决此问题。即我不想在颜色叠加的div“ testclass”内添加子div。 这不应该是“悬停效果”,我只想向背景图像添加色彩过渡。 我希望能够使用不透明度,即我正在寻找一种允许RGBA颜色的解决方案。 我正

  • 以下是我如何调用DialogFragment: 以下是(部分)我的DialogFragment是如何创建的: 这是我的DialogSelectAccount的xml 问题是始终显示一个无害的白色背景,如下所示。如何删除它?

  • 我有一个主类,该类将输出打印到控制台。。。 例如,如果行中包含A和B,我需要打印“Apple” 我将在主方法中通过首先实例化该类的对象来实现这一点,即。 代码示例:

  • 如何添加图像并将其设置为我的应用程序背景 我知道你把你想要的图片粘贴到了drawable文件夹中。这是代码本身的问题,还是我应该创建一个RelativeLayout?或者仅仅是提供的代码中的一行更改? 这是我的代码,没有任何改动。