我在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);
}
}
答案 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 Swing和Performing Custom Painting了解详情
您还应该避免使用null
布局,像素完美布局是现代ui设计中的错觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正