Java 如何删除白色背景以及如何添加木棒?

Java 如何删除白色背景以及如何添加木棒?,java,swing,billiards,Java,Swing,Billiards,我正在尝试为我的项目创建一个台球游戏,但我很难同时添加棍子和球。另外,当我添加球时,JFrame的背景变成白色,实际上应该是绿色(桌子的颜色) 非常感谢你的帮助 我试着使用图形。例如g2d.setBackground(Color.green)。这不起作用 public class Practice_Window implements MouseListener, MouseMotionListener, KeyListener { JFrame Practice_Mode = new

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

非常感谢你的帮助

我试着使用
图形
。例如
g2d.setBackground(Color.green)
。这不起作用

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); 


    }

我很难同时添加球杆和球

那么,为什么您要一次编写整个应用程序而不进行任何测试呢?为什么代码中有计时器?为什么你有键盘监听器

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

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

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

也不应使用变量名创建单个对象。这限制了可以控制的对象数量。相反,将要绘制的对象保留在ArrayList中,然后绘制方法迭代ArrayList并绘制每个对象

有关此方法的工作示例,请参见

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

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

practiceMode.getContentPane().setBackground( Color.GREEN );
我很难同时添加球杆和球

那么,为什么您要一次编写整个应用程序而不进行任何测试呢?为什么代码中有计时器?为什么你有键盘监听器

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

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

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

也不应使用变量名创建单个对象。这限制了可以控制的对象数量。相反,将要绘制的对象保留在ArrayList中,然后绘制方法迭代ArrayList并绘制每个对象

有关此方法的工作示例,请参见

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

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

practiceMode.getContentPane().setBackground( Color.GREEN );

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


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

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

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

1)这里有很多代码,很难阅读,因为它不遵循
firstWordLowerCaseVariable
firstWordLowerCaseMethod()
FirstWordUpperCaseClass
所有单词小写常量
。2) 在
Stick
类中,您有一个方法
PaintComponent
,它应该是
PaintComponent
(Java区分大小写),添加
@Override
注释以从Java编译器获取警告。3) 为什么两行之间有这么大的间距?在添加所有元素之前,使框架可见会使阅读变得更加困难<代码>练习模式。设置可见(真)
应该是添加所有组件后该类上的最后一行。5)
红色
黄色
白色
practiceMode.getContentPane().setBackground( Color.GREEN );