Java:更改jPanel的背景色

Java:更改jPanel的背景色,java,swing,border-layout,Java,Swing,Border Layout,我有panel1和borderlayout。里面有一个ball对象,我想用一个按钮改变背景颜色,但ball对象不允许我改变背景。为什么?它不会改变,无论是球背景还是面板背景。。。我该怎么走? 这是我的密码: import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class project1 extends J

我有
panel1
borderlayout
。里面有一个ball对象,我想用一个按钮改变背景颜色,但ball对象不允许我改变背景。为什么?它不会改变,无论是球背景还是面板背景。。。我该怎么走? 这是我的密码:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class project1 extends JFrame implements ActionListener{


   Color color;
  final JRadioButton sc;
  final JRadioButton bc;
  static JPanel panel1;
  JFrame frame = new JFrame("frame");
  private JPanel panel2;
  private ball b;




  public project1() {



   panel1 = new JPanel();   //panel for ball component

   panel1.setBackground(color);
   panel1.setLayout(new BorderLayout());

  //problem starts here

   panel1.add(b,BorderLayout.CENTER); 

   b.setOpaque(false); 


    panel2 = new JPanel();   //panel for button group
    panel2.setLayout(new FlowLayout());

    panel2.setBorder(BorderFactory.createLineBorder(Color.black));  //draw border for panel1 and panel 2
    panel1.setBorder(BorderFactory.createLineBorder(Color.blue));

    JButton st_btn = new JButton("start");
    JButton sp_btn = new JButton("stop");
    JButton color_btn = new JButton("color");

    sc = new JRadioButton("SC");
    bc = new JRadioButton("BC");

    final ButtonGroup bgroup = new ButtonGroup();
    bgroup.add(sc);
    bgroup.add(bc);



    sc.addActionListener(this);
    bc.addActionListener(this);
    color_btn.addActionListener(this);

    //panel2.add(Button);
    panel2.add(st_btn);
    panel2.add(sp_btn);
    panel2.add(sp_btn);
    panel2.add(color_btn);
    panel2.add(sc);
    panel2.add(bc);


    setLayout(new BorderLayout()); // frame layout

    add(panel2, BorderLayout.SOUTH);
    add(panel1, BorderLayout.CENTER);  // ball appears here


    pack();
    setResizable(false);
    setSize(500, 500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);

  }


  @Override
   public void actionPerformed(ActionEvent e) {

      color = JColorChooser.showDialog(this, "Select a Background Color", Color.pink);
        Object o = e.getSource();

      if (o.equals(sc)) {
          panel1.setBackground(color);

            repaint();  }

      else if (o.equals(bc)) {
           b.setColor(color);
               repaint();     }
  }



  public static void main(String[] args) {




    javax.swing.SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        project1 ex = new project1();
        ex.setVisible(true);    
      }

    });
  }


}
这是我的球类。ı将球分配到上面project1类中的框架

import java.awt.*;

import javax.swing.JPanel;


public class ball extends JPanel {





int x_Pos = 180;
  int y_Pos = 100;
  static Color color;  //ball color



    void up() {
    y_Pos -= 5;
    //repaint();
  }

  void down() {
    y_Pos += 5;
    //repaint();
  }

  void left() {
    x_Pos -= 5;
    //repaint();
  }

  void right() {
    x_Pos += 5;
    //repaint();
  }

  public void paintComponent(Graphics aBall) {

    super.paintComponent(aBall);
    aBall.drawOval(x_Pos, y_Pos, 190, 190);  // take fixed radius
    aBall.setColor(color);
    aBall.fillOval(x_Pos, y_Pos, 190, 190);

  }

  void setColor(Color color){
    this.color = color;


}
}

可能发生的情况是,由于您将
面板的布局设置为
边框布局
,因此为
球设置的任何首选尺寸都无关紧要,因为
边框布局
不考虑首选尺寸。也就是说,当您添加
球时,它会扩展到面板的大小。由于
JPanel
在默认情况下是不透明的,因此可以将背景设置为
面板
,但您不会看到它,因为它被
面板覆盖。因此,一个解决方案就是将
setOpaque(false)
设置为
ball

另外,除非您不打算对要添加到
面板的新球做任何事情。你可能想给它一个参考

ball someBall = new ball();
panel1.add(someBall ,BorderLayout.CENTER);
看起来您正试图更改
b
的背景,它应该是面板中的球,但您向面板添加了一个
new ball()
,而没有引用。因此,如果您希望任何
b
更改您添加的
新球()的颜色,请三思。通过上面的参考,您可以执行
someBall.setBackground()


您还应该遵循Java命名约定,类名以大写字母开头

班级舞会
→ <代码>类球

尝试重新验证();重新喷漆前();Try,panel1.getContentPane.setBackground(颜色);
ball
class aJPanel?class是从JPanel扩展而来的。没有问题。而ıt不接受getContentPane,我认为是因为BorderLayout看到了我的答案。看看它是否有用。panel1.add(someBall,BorderLayout.CENTER);执行此操作时,单击“运行”没有错误,但屏幕上不会显示任何内容只有在添加新球()的情况下,帧上的球才会显示,否则不会出现任何内容。我无法解决问题添加
panel1.add(new ball())
ball someBall=new ball()之间没有区别;面板1.添加(someBall)两者都应该再次工作,没有区别。第二个只提供了对正在添加的
newball()
的引用。为了获得进一步的帮助,请发布一个我们可以测试的可运行示例。我到底在寻找什么?