背景色を大きなパネル (別名ディスプレイパネル) の背景色と一致させる 4 つのパネルのいずれかをクリックするようにユーザーに求める非常に単純なプログラムがあります。出てくる; displaypanels の背景は一時的に黒に設定されます。はいをクリックすると、displaypanel は背景色を再設定する必要があります。問題は、背景が常に更新されているとは限らないことです。代わりに、背景が黒のままになることがあります。...さらに紛らわしいのは、このプログラムのウィンドウ上に別のウィンドウをドラッグすると、表示パネル上を移動するか、別のウィンドウに切り替えて再表示するときに色が部分的に更新される場合に、黒のままであるということです。完全に更新された背景色。
では、なぜ setMethod が呼び出されるのに、描画メソッドが舞台裏で実行されているのかによって、たまにしか実行されないのでしょうか? また、他のウィンドウやフレームをキャストすると、それが見えるようになるのはなぜですか? 処理中のマウスクリックイベントと関係がありますか?
このすべての説明に感謝します、みんなに感謝します
public class MainPanel extends JPanel{
Subpanel panel1;
Subpanel panel2;
Subpanel panel3;
Subpanel panel4;
Subpanel displaypanel;
Color[] color; //stores all the colors that display on the subpanels
public static void main(String[] args) {
JFrame window=new JFrame("This is a test");
window.setContentPane(new MainPanel());
window.setLocation(100,30);
window.setSize(600,500);
window.setVisible(true);
}
public MainPanel(){
setLayout(new FlowLayout(FlowLayout.CENTER,80,30));
panel1= new Subpanel();
panel2= new Subpanel();
panel3= new Subpanel();
panel4= new Subpanel();
//the big sub panel
displaypanel= new Subpanel();
color=new Color[4];
color[0]=Color.BLUE;
color[1]=Color.RED;
color[2]=Color.YELLOW;
color[3]=Color.GREEN;
setBackground(Color.GRAY);
displaypanel.setBackground(displayRandomColor());
panel1.setBackground(color[0]);
panel2.setBackground(color[1]);
panel3.setBackground(color[2]);
panel4.setBackground(color[3]);
displaypanel.setPreferredSize(new Dimension(400,250));
panel1.setPreferredSize(new Dimension(70,70));
panel2.setPreferredSize(new Dimension(70,70));
panel3.setPreferredSize(new Dimension(70,70));
panel4.setPreferredSize(new Dimension(70,70));
add(displaypanel);
add(panel1);
add(panel2);
add(panel3);
add(panel4);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
}
public Color displayRandomColor(){
Color i=Color.WHITE;
switch ((int)(Math.random()*4)+1){
case 1:
i= Color.YELLOW;
break;
case 2:
i= Color.BLUE;
break;
case 3:
i= Color.GREEN;
break;
case 4:
i= Color.RED;
}
return i;
}
public class Subpanel extends JPanel{
public Subpanel(){
this.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent evt){
Component source=(Component)evt.getSource();
if((source.getBackground()).equals(displaypanel.getBackground())){
//do nothing for this test..
}
else{
displaypanel.setBackground(Color.BLACK);
//ask user to reset the background color
//**the following 2 lines introduces the problem
if(JOptionPane.showOptionDialog(null,"click Yes to see a new Color","Incorrect",JOptionPane.YES_NO_OPTION,JOptionPane.PLAIN_MESSAGE,null,null,null)==JOptionPane.YES_OPTION){
displaypanel.setBackground(displayRandomColor());
}
}
}
});
} //end of constructor
public void paintComponent(Graphics g){
super.paintComponent(g);
}
}
}