2012-08-31 131 views
5

我有一个JFrame其中有2 JPanel其中:a PaintPanel(与paint()方法)和ButtonPanel(带按钮)。当我调用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();   
    } 
} 

这重新前人的精力我有问题(对不起,奇码标记,似乎无法得到它的权利)。

我真的希望你一个人知道这里发生了什么,因为我不...

+1

这种渲染物体往往不能兑现[透明度]出现( http://java.sun.com/products/jfc/tsc/articles/painting/index.html#props)属性。此外,“Swing程序应该重写'paintComponent()',而不是重写'paint()'。” - [* AWT和Swing中绘制:绘制方法*](http://java.sun.com/products/jfc /tsc/articles/painting/index.html#callbacks)。 – trashgod

回答

6

首先,你应该重写paintComponent()而不是paint()。这是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。 @aymeric你必须记住,图形对象被重用,所以如果你没有花时间确定你已经清理了它,那么最终会出现意想不到的paint artefact – MadProgrammer