2014-04-15 3 views
0

나는 panel1borderlayout을 가지고 있습니다. 볼 오브젝트가 있고 버튼으로 배경색을 변경하고 싶지만 볼 오브젝트로 배경을 변경할 수 없습니다. 왜? 그것은 변화하지 않고 볼 배경이나 패널 배경도 변경되지 않습니다 ... 어떻게하면됩니까? 다음은 내 코드입니다 :자바 : jPanel의 배경색 변경

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

    }); 
    } 


} 

이 내 볼 프로젝트 1의 class.above 내 프레임에 공을 할당 군 수업. 아마 무슨 일

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; 


} 
} 
+0

시도의 재 검증을 시작 할 수있다; 다시 칠하기 전에(); – Pphoenix

+0

시도해보십시오. panel1.getContentPane.setBackground (color); – astack

+0

'ball' 클래스는 JPanel인가요? –

답변

1

BorderLayoutpanel의 레이아웃을 설정하기 때문에, 당신은 ball을 위해 설정 한 적절한 사이즈를 선호하는 크기를 존중하지 않는 BorderLayout으로 문제가되지 않는다는 것입니다. 즉, ball을 추가하면 패널 크기까지 확장됩니다. JPanel은 기본적으로 불투명하므로 배경을 panel으로 설정할 수 있지만 ball 패널에서 다루고 있기 때문에 표시되지 않습니다. 따라서 해결책은 setOpaque(false) ~ ball 일 것입니다.

또한 새로운 공에 대한 작업을 계획하지 않는 한 panel에 추가됩니다. 참조 할 수도 있습니다.

ball someBall = new ball(); 
panel1.add(someBall ,BorderLayout.CENTER); 

당신은 아마 패널에서 공입니다 b의 배경을 변경하기 위해 노력하고 있지만 더 참조하여 패널에 new ball()를 추가 할 것 같습니다. 따라서 b이 추가 한 new ball()의 색상을 변경하는 것으로 생각되면 다시 생각해보십시오. 당신은 위의 참조, someBall.setBackground()


은 또한 당신이 자바 명명 규칙을 따라야합니다, 클래스 이름) (대문자와
class ballclass Ball

+0

panel1.add (someBall, BorderLayout.CENTER); 이 작업을 수행 할 때 아무런 오류가 없지만 아무 것도 화면에 나타나지 않습니다. – user3535290

+0

Ok 및? –

+0

새 볼()이 추가 된 경우에만 프레임에 볼이 나타나면 아무 것도 나타나지 않습니다. 문제 해결하기 – user3535290