2012-08-31 2 views
5

PaintPanel (paint() 메서드 사용) 및 ButtonPanel (버튼 사용)의 두 JPanelJFrame이 있습니다. PaintPanelrepaint()을 호출하면 (버튼을 클릭하면) ButtonPanel 버튼이 PaintPanel에 그려져 있습니다! 그것은 클릭 할 수 없거나, 단지 거기에 있습니다.다시 칠 때 JButton이 복사됩니까?

public class Main { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("frame"); 
     frame.setSize(400,400); 
     frame.setLayout(new GridLayout(2,1)); 
     PaintPanel paint = new PaintPanel(); 
     ButtonPanel buttons = new ButtonPanel(paint); 
     frame.add(paint); 
     frame.add(buttons); 
     frame.setVisible(true); 
    } 
} 

public class PaintPanel extends JPanel{ 
    public void paint(Graphics g){ 
     g.drawRect(10, 10, 10, 10); 
    } 
} 

public class ButtonPanel extends JPanel implements ActionListener{ 

    private PaintPanel paintPanel; 

    public ButtonPanel(PaintPanel paintPanel){ 
     this.paintPanel=paintPanel; 
     JButton button = new JButton("button"); 
     button.addActionListener(this); 
     add(button); 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     paintPanel.repaint();   
    } 
} 

이것은 내가 가지고있는 문제를 다시 sould (홀수 코드 표시에 대한 미안, 바로 그것을 얻을 수없는 것) :

는이 코드의 문제를 다시 시도했다.

은 정말 모든

+1

이러한 렌더링 아티팩트가 종종 [불투명도] 명예 실패에서 발생은 (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#props) 속성 게다가, "스윙 프로그램은'paint()'를 오버라이드하는 대신에'paintComponent()'를 덮어 써야합니다."- [* AWT와 스윙의 페인팅 : 페인트 메소드 *] (http://java.sun.com/products/jfc /tsc/articles/painting/index.html#callbacks). – trashgod

답변

6

첫째, 당신은 paintComponent() 대신 paint() 오버라이드 (override) 할 필요가 ... 난이 없기 때문에 중 하나가 여기에 무슨 일이 일어나고 있는지 알고 있기를 바랍니다. 패널 사용자 정의를 할 때 Swing의 모범 사례 중 일부입니다.

둘째, 여기에 (: S는 당신이 생각하지 않는 이유를 모르겠어요) : 나를 위해 작동 코드입니다

public class Main { 

    public static void main(String[] args) { 

     JFrame frame = new JFrame("frame"); 
     frame.setSize(400, 400); 
     // frame.setLayout(new GridLayout(2, 1)); 
     PaintPanel paint = new PaintPanel(); 
     ButtonPanel buttons = new ButtonPanel(paint); 
     // frame.add(paint); 
     // frame.add(buttons); 
     frame.setVisible(true); 

     JPanel pan = new JPanel(new BorderLayout()); 
     pan.add(paint); 
     pan.add(buttons, BorderLayout.SOUTH); 
     frame.add(pan); 

    } 
} 

class PaintPanel extends JPanel { 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(new Color(new Random().nextInt())); 
     g.drawRect(10, 10, 10, 10); 
    } 
} 

class ButtonPanel extends JPanel implements ActionListener { 

    private final PaintPanel paintPanel; 

    public ButtonPanel(PaintPanel paintPanel) { 

     this.paintPanel = paintPanel; 
     JButton button = new JButton("button"); 
     button.addActionListener(this); 
     add(button); 
    } 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     if (getParent() != null) { 
      getParent().repaint(); 
     } 
    } 
} 
+1

자주 super.paintComponent (g)를 갖고 싶습니다. 재정의 한 paintComponent 메소드의 첫 번째 행으로 그것은 당신이 다시 그리기위한 특별한 호출을 그리지 않는 모든 것을 지울 것입니다. – mrranstrom

+0

@mrranstrom 그래, 맞아! 내 견본을 고쳤어, 고마워! – aymeric

+2

+1은 paintComponent 및 super.paintCompont입니다. @yemeric 당신은 기억해야한다. Graphics 객체는 재사용된다. 그래서 당신이 먼저 청소했는지 확인하기 위해 시간을 들이지 않는다면, 예기치 않은 페인트 인공물 – MadProgrammer

관련 문제