PDA

View Full Version : [Q] Cho mình hỏi về JFrame và JPanel .Khẩn cấp :(((



lehai1
26-05-2003, 04:59
Mình vẽ hình trên 1 lớp Pa extends JPanel sau đó add 1 đối tương p1 của Pa vào JFrame
Minh gắn 1 cái nút
Mình gọi hàm mình vẽ của Pa (1 cái demo nhỏ thui)
Nếu mà minh goi hàm vẽ ở ngoài actionListener của nút thì nó chạy ok(làm đầy đủ các bước tui vẽ demo)
nhưng mình bỏ hàm vẽ đó vào nút thì nó chạy hết cái demo xong rùi nó mới vẽ cái kết quả cuối cùng ra màn hình.
Sao kỳ vậy.
Với lai tại sao khi bỏ hàm vẽ vào actionListener thì đối tượng p1 tui tạo ra phải khai báo là final
Xin cứu khẩn:eek: lol

miagiste
26-05-2003, 20:21
Day la do van de cua swing day ma. Khi ban su dug swing thi jvm se tao ra mot thread de quan ly interface. Khi ban goi ham ve thi thread nay se ve cho ban va no khong the cung mot luc refresh man hinh duoc (ban co the xem chi tiet trong documentation api cua Sun, method paint()). Vi the ban moi thay ket qua in ra vao luc cuoi cung. De tranh viec nay thi ban co the dung mot thread de ve va mot thread de refresh man hinh.

Con khi ban tao mot anonymous class ma muon truy nhap vao variable cua parent class thi cac variables nay phai khai bao la final.

lehai1
28-05-2003, 06:07
Cám ơn bồ, để mình thử lại nha!:))

abcdef
28-05-2003, 08:33
override lại hàm paint() sau đó trong cái actionLstener của cái button đó gọi repaint()

lehai1
29-05-2003, 06:49
Cách của bạn miagiste mình chưa hiểu rõ cách dùng lắm.dùng 2 thread là như thế nào.Bạn chỉ rõ hơn nha.Còn cách của abcdef không dùng được vì khi mình gọi hàm vẽ của p1 , vì hàm vẽ của p1 mình đặt trong vòng lặp nên nó vẽ liên tục (hàm vẽ của p1 riêng)xong rùi nó mới gọi hàm repaint() mình vừa override.Vả lại, khi hàm vẽ của p1 thực hiện và nằm trong action listenner thì nó đoạt luôn quyền điều khiển cửa sổ của JFrame chứa nó.kíu với!

lehai1
29-05-2003, 07:20
mình gửi code sơ sơ lên cho các bạn sửa dùm nhé
Đầu tiên mình có 1 lớp dùng đế que, trong đó mình có viết 1 hàm để vẽ que
public class Stick {

....
void paintStick(Graphics g) {
g.setColor( cur_colour );
g.fill3DRect( x, y-h, w, h, pressed );
}
}
sau đó mình có 1 lớp Pa extends JPanel như sau,trong này mình viết các hàm dùng làm vẽ demo , paint

public class Pa extends JPanel{
Stick[] sticks;
......

.......
void BubbleSort()
{int i,j;
for (i=0;i<max_sticks-1;i++)
{ for (j=max_sticks-1;j>i;j--)
{
sticks[j-1].setCurrentColour(new Color(0,250,0));
sticks[j].setCurrentColour(new Color(0,250,0));
repaint();
delay1();
if (sticks[j].value<sticks[j-1].value)
swapSticks(j-1,j);
sticks[j-1].setCurrentColour(Color.red);
sticks[j].setCurrentColour(Color.red);
}
sticks[i].setCurrentColour(new Color(150,202,250));

repaint();
}
}

}

public void paint(Graphics g) {
panel_height = size().height;
int w = size().width;

g.setColor(new Color(238,250,150));
g.fillRect( 0,0, w, panel_height );
g.setColor(new Color(0,0,0));
g.drawRect( 0,0, w, panel_height-1 );
for (int i = 0; i < nsticks; i++) {

sticks[i].paintStick(g);
} // paint()*/

}
}
cuối cùng mình có 1 lớp f1 extend JFrame như sau, ở lớp này tui chỉ gắn vào buttonGenerate ,3 nút kia khônng cần quan tâm

public class f1 extends JFrame
{ int max_data=12;
JPanel panel,p2;
JButton buttonPlay,buttonGenerate,buttonStop,buttonExit;
Pa p1;

public f1()
{
setTitle("Interchange sort");
getContentPane().setBackground(new Color(138,150,250));
p1=new Pa();

this.addWindowListener(new WL());
Listen listen = new Listen();



buttonGenerate = new JButton(new ImageIcon("pic1\\kt.gif"));
buttonGenerate.setBackground(new Color(238,250,150));
buttonGenerate.setPreferredSize(new Dimension(126,118));
buttonGenerate.setPressedIcon(new ImageIcon("pic1\\kt1.gif"));
buttonGenerate.setCursor(new Cursor(Cursor.HAND_CURSOR));

buttonGenerate.addActionListener(listen);



buttonPlay = new JButton(new ImageIcon("pic1\\th.gif"));
buttonPlay.setBackground(new Color(238,250,150));
buttonPlay.setPreferredSize(new Dimension(126,118));
buttonPlay.setPressedIcon(new ImageIcon("pic1\\th1.gif"));
buttonPlay.setCursor(new Cursor(Cursor.HAND_CURSOR));


buttonStop = new JButton(new ImageIcon("pic1\\d.gif"));
buttonStop.setBackground(new Color(238,250,150));
buttonStop.setPreferredSize(new Dimension(126,118));
buttonStop.setPressedIcon(new ImageIcon("pic1\\d1.gif"));
buttonStop.setCursor(new Cursor(Cursor.HAND_CURSOR));


buttonExit = new JButton(new ImageIcon("pic1\\t.gif"));
buttonExit.setBackground(new Color(238,250,150));
buttonExit.setPreferredSize(new Dimension(126,118));
buttonExit.setPressedIcon(new ImageIcon("pic1\\t1.gif"));
buttonExit.setCursor(new Cursor(Cursor.HAND_CURSOR));


panel = new JPanel();
panel.setBackground(new Color(138,150,250));
panel.setBorder(new LineBorder(Color.red,5,true));

GridBagLayout gb1 = new GridBagLayout();;
GridBagConstraints gbc1 = new GridBagConstraints();



panel.setLayout(gb1);
gbc1.anchor = GridBagConstraints.CENTER;
gbc1.weightx = 1;
gbc1.weighty = 1;

gbc1.gridx = 1;
gbc1.gridy = 1;
gbc1.gridwidth=3;
gbc1.gridheight=4;
gb1.setConstraints(p1,gbc1);
panel.add(p1,gbc1);

p2 = new JPanel();
p2.setBackground(new Color(40,13,186));
p2.setBorder(new LineBorder(Color.black,1,false));
p2.add(buttonGenerate);


gbc1.gridx = 4;
gbc1.gridy = 1;
gbc1.gridwidth=1;
gbc1.gridheight=1;
gbc1.fill=GridBagConstraints.BOTH;
gb1.setConstraints(p2,gbc1);
panel.add(p2);

p2 = new JPanel();
p2.setBackground(new Color(40,13,186));
p2.setBorder(new LineBorder(Color.black,1,false));
p2.add(buttonPlay);


gbc1.gridx = 4;
gbc1.gridy = 2;
gbc1.gridwidth=1;
gbc1.gridheight=1;

gb1.setConstraints(p2,gbc1);
panel.add(p2);

p2 = new JPanel();
p2.setBackground(new Color(40,13,186));
p2.setBorder(new LineBorder(Color.black,1,false));
p2.add(buttonStop);


gbc1.gridx = 4;
gbc1.gridy = 3;
gbc1.gridwidth=1;
gbc1.gridheight=1;
gb1.setConstraints(p2,gbc1);
panel.add(p2);


p2 = new JPanel();
p2.setBackground(new Color(40,13,186));
p2.setBorder(new LineBorder(Color.black,1,false));
p2.add(buttonExit);


gbc1.gridx = 4;
gbc1.gridy = 4;
gbc1.gridwidth=1;
gbc1.gridheight=1;
gb1.setConstraints(p2,gbc1);
panel.add(p2);


getContentPane().add(panel,BorderLayout.CENTER);

p1.setBackground(Color.blue);



setSize(800,570);
setVisible(true);


Khi tui gọi ở đây thì nó chạy bình thường

p1.generateRandomData(max_data);
p1.setMax(max_data);
p1.setSticks(max_data);

p1.BubbleSort();





}

class Listen implements ActionListener
{
public void actionPerformed(ActionEvent ev)
{
Object obj = ev.getSource();
if (obj == buttonGenerate)
{


còn khi tui bỏ nó vào đây thì nó chỉ vẽ ra kết quả cuối cùng khi
đã demo xong
/* p1.generateRandomData(max_data);
p1.setMax(max_data);
p1.setSticks(max_data);
p1.interchangeSort();*/
}

}

}


static class WL extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{ System.exit(0);}
}




public static void main(String[] args)
{
f1 k=new f1();


}


}

Rất mong được giúp đỡ
Nếu bạn muốn có code hoàn chỉnh để sửa thì mail cho mình
phuocsonhh@yahoo.com