0

私が書いているアプリケーションで a を再インスタンス化する必要がありますJPanel(基本的には、ユーザーがグラフを作成できる入力ウィンドウであり、ユーザーがそれを空にできるようにしたいので、使用CardLayoutはオプションではありません)。次のようなものを使用することを考えていました:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class AppletProve extends JPanel implements MouseListener, MouseMotionListener{

private JPanel p1;
public AppletProve(){
    super();
    setLayout(null);
    Dimension dim=Toolkit.getDefaultToolkit().getScreenSize();
    dim.width=(int) (dim.width*0.66);
    dim.height=(int) (dim.height*0.75);
    setPreferredSize(dim);
    addMouseListener(this);
}
public void crea(){
    p1=new JPanel();
    p1.setBounds(10,10,60,70);
    p1.setBackground(Color.YELLOW);
    JLabel lbl1=new JLabel("prova1");
    p1.add(lbl1);
    add(p1);
}
public void collega(){
    remove(p1);
    p1=new JPanel();
    p1.setBounds(10,10,60,70);
    p1.setBackground(Color.BLUE);
    JLabel lbl2=new JLabel("prova2");
    p1.add(lbl2);
    add(p1);
}
@Override
public void mouseClicked(MouseEvent arg0) {
    System.out.println("chiamato");
    collega();

}
@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
@Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
@Override
public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
@Override
public void mouseDragged(MouseEvent arg0) {
    repaint();

}
@Override
public void mouseMoved(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
}

問題は、パネル p1 が再インスタンス化されている間、背景色が変更されるため、lbl2 が表示されないことです。これは、パネルを空白の状態に再インスタンス化するだけであればそれほど悪くはありませんが、これを使用することを考えていましたデコレータ パターンを使用してパネルに責任を追加する方法もあるため、新しく復元されたパネルのコンポーネントを表示する必要があります。

4

1 に答える 1

3

ユーザーが空にできるようにしたいので、CardLayoutを使用することはできません

もちろんそうだ。CardLayout.removeLayoutComponent(Component)を参照してください。

于 2011-10-18T10:11:52.370 に答える