使用repaint()进行奇怪的重新定位;

时间:2015-01-21 16:13:37

标签: java swing repaint

我在JPanel中有一个JSlider,它返回一个R-G-B的值。 我在JPanel的Costructor中创建它。我在同一个Panel中绘制(使用paintComponent)一个小圆圈,然后使用Slider改变颜色。我想要滑块移位当代的颜色变化。 所以,我使用方法重绘..在Panel旁边有另一个Panel,有两个按钮..如果我在第一个面板中使用方法重绘,第二个面板的按钮重复在First Panel的topLeft中。为什么?谢谢你。

第一小组:

public class OptionsPanel extends JPanel {


static JSlider RBG = new JSlider(0,255);
OptionsPanel(){

this.setVisible(false);
this.setSize(350,1000);
this.setLayout(null);
this.setBackground(new Color(200,200,0));
Main.f1.add(this); 



 RBG.setVisible(true);
 RBG.setSize(255,50);
 RBG.setLocation(30,240);


 this.add(RBG);



LotL lotl = new LotL();
Button save = new Button("Save");

save.setVisible(true);
save.setSize(100,40);
save.setLayout(null);
save.setLocation(60,300);
save.addActionListener(lotl); 
save.setBackground(Color.yellow);
save.identificatore=3;
this.add(save);







  }


  boolean draw=false;

  @Override
 public void paintComponent(Graphics g){



 g.drawOval(50,100,70,70);

 g.setColor(new Color(RBG.getValue(),180,200));
 g.fillOval(50,100,70,70);


 repaint();




}
}

第二小组:

public class FirstPanel extends JPanel{
FirstPanel(){

this.setVisible(true);
this.setSize(1000,1000);
this.setLayout(null);
this.setBackground(new Color(255,200,180)); 
Main.f1.add(this);

Button start = new Button("Start Game!");


Button options = new Button("Options");
LotL LotL = new LotL();  



start.setVisible(true);
start.setSize(200,80);
start.setLayout(null);
start.setLocation(400,450);
start.addActionListener(LotL); 
start.setBackground(Color.green);
start.identificatore=1;
this.add(start);

options.setVisible(true);
options.setSize(200,70);
options.setLayout(null);
options.setLocation(400,550);
options.addActionListener(LotL); 
options.setBackground(Color.green);
options.identificatore=2;
this.add(options);

}


}

1 个答案:

答案 0 :(得分:2)

你已经破坏了油漆链......

@Override
public void paintComponent(Graphics g){

    g.drawOval(50,100,70,70);

    g.setColor(new Color(RBG.getValue(),180,200));
    g.fillOval(50,100,70,70);


    repaint();

}

Graphics是一个共享资源,它会传递给在给定绘制周期中绘制的所有组件。

paintComponent的一项工作是为绘画准备Graphics上下文,但填充组件背景颜色。

在执行任何自定义绘画之前,您必须先调用super.paintComponent

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawOval(50,100,70,70);

    g.setColor(new Color(RBG.getValue(),180,200));
    g.fillOval(50,100,70,70);
}

此外,paintComponent永远不需要public,任何人都不应该直接调用,也不要在任何可能触发重绘的绘制方法中修改组件的状态,你会陷入无限循环,最终消耗你的CPU并使你的计算机无法使用。

请查看Painting in AWT and SwingPerforming Custom Painting了解详情

您还应该避免使用null布局,像素完美布局是现代ui设计中的错觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正