2012-08-31 16 views
5

İçinde 2 JPanel bulunan bir JFrame var: bir PaintPanel (bir paint() yöntemi ile) ve bir ButtonPanel (düğmeleri ile). PaintPanel'un repaint()'unu (ancak düğmeyi tıklatarak) çağırdığımda ButtonPanel düğmesinin PaintPanel içinde boyanması! Tıklanabilir veya bir şey değil, sadece orada.JButton, yeniden boyanırken kopyalandı mı?

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

Bu aldığım sorunu yeniden ruh (tek kod işaretleri için üzgün, doğru almak gibi olamaz):

Bu kod ile sorunu yeniden çalıştı.

Gerçekten tüm

+1

Böyle render eserler genellikle [opaklığı] yerine getirilmemesinin kaynaklanan (http://java.sun.com/products/jfc/tsc/articles/painting/index.html#props) özellik. Üstelik, "Swing programları" paint() karakterini geçersiz kılmak yerine paintComponent() 'i geçersiz kılar. "- [* AWT ve Swing'de Boyama: Boya Yöntemleri *] (http://java.sun.com/products/jfc /tsc/articles/painting/index.html#callbacks). – trashgod

cevap

6

Önce, paintComponent() yerine paint() geçersiz kılar ... i do not senin yüzünden biri burada neler olduğunu bilir umuyoruz. Bazı panel özelleştirmeleri yapıldığında Swing'deki en iyi uygulamaların bir parçası.

İkincisi, burada (: S senin olsa neden açılmadığını bilmiyorum): benim için çalışan koddur

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

Genellikle süper.paintComponent (g) olmasını istersiniz; geçersiz kılınan paintComponent yönteminizdeki ilk satır olarak. Yeniden çizmek için o çağrıda çizmediğiniz her şeyi temizler. – mrranstrom

+0

@mrranstrom Bu doğru! Örneğimi tamir ettim, teşekkürler! PaintComponent & super.paintCompont için – aymeric

+2

+1. Hatırlamak zorunda olduğunuz @aymeric, Graphics nesnesi yeniden kullanılır. Bu nedenle, ilk önce temizlediğinizden emin olmak için zaman ayırmazsanız, 'super.paintComponent kullanımı için beklenmedik boya gereçleri – MadProgrammer

İlgili konular