Hỗ trợ lập trình Java
Hãy đăng nhập để tham gia thảo luận và chia sẻ!
Hỗ trợ lập trình Java
Hãy đăng nhập để tham gia thảo luận và chia sẻ!
Hỗ trợ lập trình Java

Diễn đàn hỏi đáp Java, hướng dẫn bài tập Java, Giúp đỡ về Java


You are not connected. Please login or register

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down  Thông điệp [Trang 1 trong tổng số 1 trang]

1Bài 1- Buổi 4 Empty Bài 1- Buổi 4 Mon Nov 12, 2012 9:00 am

Admin


Admin
Admin
Do sử dụng đệ quy, nên các bác test nhẹ khoảng <=10 vì nhiều quá tội nghiệp máy các bác@@

Code:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Bai1 {
    JFrame frame;
    JLabel top_lb,lb;
    JTextField tf;
    JButton bt;
    JPanel bot;
    myPane tritan;
    int x1,y1,x2,y2,x3,y3;
    Bai1(){
        frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.setTitle("Tam giac");
        frame.setSize(new Dimension(410, 350));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(200, 200);
        tritan = new myPane();
        lb = new JLabel("Enter number of oder: ");
        top_lb = new JLabel();
        top_lb.setSize(new Dimension(410, 350));
        tf = new JTextField(6);
        bot = new JPanel(new FlowLayout());
        bt = new JButton("Show");
        bt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int num = Integer.parseInt(tf.getText());
                if (num>=0){
                    x1=0; y1=250;
                    x2=200; y2=0;
                    x3=400; y3=250;
                    tritan.setL(num);
                    tritan.repaint();
                }
            }
        });
        bot.add(lb);
        bot.add(tf);
        bot.add(bt);
        frame.add(tritan,BorderLayout.CENTER);
        frame.add(bot,BorderLayout.SOUTH);
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        Bai1 obj = new Bai1();
    }
}

class myPane extends JPanel{
    int x1,y1,x2,y2,x3,y3,n;
    public void setL(int n){
        this.n=n;
        this.x1=0; this.y1=250;
        this.x2=200; this.y2=0;
        this.x3=400; this.y3=250;
    }
    public void create(int x1,int y1,int x2,int y2,int x3,int y3,int n,Graphics g){
        g.drawLine((int)(x1+x2)/2,(int)(y1+y2)/2,(int)(x2+x3)/2,(int)(y2+y3)/2);
        g.drawLine((int)(x3+x2)/2,(int)(y3+y2)/2,(int)(x1+x3)/2,(int)(y1+y3)/2);
        g.drawLine((int)(x1+x3)/2,(int)(y1+y3)/2,(int)(x2+x1)/2,(int)(y2+y1)/2);
       
        if (n==1) return;
       
        create(x1,y1,(int)(x2+x1)/2,(int)(y2+y1)/2,(int)(x1+x3)/2,(int)(y1+y3)/2,n-1,g);
        create(x2,y2,(int)(x2+x1)/2,(int)(y2+y1)/2,(int)(x3+x2)/2,(int)(y3+y2)/2,n-1,g);
        create(x3,y3,(int)(x1+x3)/2,(int)(y1+y3)/2,(int)(x3+x2)/2,(int)(y3+y2)/2,n-1,g);
    }
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawLine(x1, y1, x2, y2);
        g.drawLine(x2, y2, x3, y3);
        g.drawLine(x3, y3, x1, y1);
        if (n>0)
            create(x1,y1,x2,y2,x3,y3,n,g);
 
    }
}

https://javasupport.forumvi.com

2Bài 1- Buổi 4 Empty cho mình hỏi Mon Nov 19, 2012 11:23 pm

m1_huy


Vịt mới lớn
Vịt mới lớn
cái đoạn tritan.repaint();
repaint() này ở đâu ra vậy bạn?

còn cái lớp cuối paintComponent để làm gì vậy bạn?

tại sao phải super.paintComponent

3Bài 1- Buổi 4 Empty đường kẻ Mon Nov 19, 2012 11:41 pm

m1_huy


Vịt mới lớn
Vịt mới lớn
làm sao để có 1 đường kẻ giữa top_lb với bot panel cho giống với cái hình của đề cô vậy bạn

4Bài 1- Buổi 4 Empty @m1_huy Tue Nov 20, 2012 12:47 am

Admin


Admin
Admin
Chào bạn,

cái đoạn tritan.repaint();
repaint() này ở đâu ra vậy bạn?
tritan là một đối tượng được tạo ra từ lớp myPane thừa kế từ Jpanel.

Phương thức repaint() dùng để vẽ lại hình ảnh (thực chất là repaint() gọi đến phương thức update() sau đó gọi đến phương thức paint())

Ví dụ trên, tôi dùng một hàm setL(int) để truyền số n(số tam giác con) vào đối tượng tritan, lúc này tôi thực hiện các thao tác Vẽ lại. Khi thực hiện xong, thì những gì hiển thị trên frame cũng không hề thay đổi, đến khi gọi phương thức repaint() cho đối tượng tritan thì nó mới update và vẽ lại.


còn cái lớp cuối paintComponent để làm gì vậy bạn?

Phương thức paint Component là 1 phương thức có sẵn khi thừa kế Jpanel và ta phải @override lại nó.


tại sao phải super.paintComponent

Lời gọi super.paintComponent(g) để xoá sạch vùng hiển thị trước khi bạn vẽ!



làm sao để có 1 đường kẻ giữa top_lb với bot panel cho giống với cái hình của đề cô vậy bạn

Thực ra, ở giữa 2 phần không phải là một đường kẻ, nếu như bạn để ý trong ảnh của cô chụp thì nó là 1 cái border bao bọc cái bot. Bạn có thể thêm dòng này vào:
Code:
bot.setBorder(BorderFactory.createLineBorder(Color.gray));

Chúc bạn học tốt!
Thân

https://javasupport.forumvi.com

5Bài 1- Buổi 4 Empty Re: Bài 1- Buổi 4 Tue Nov 20, 2012 11:46 am

m1_huy


Vịt mới lớn
Vịt mới lớn
muốn thanks mà ko thấy nút cám ơn ở đâu cả Very Happy
kiểu này t6 thì phải ngồi kế admin mới đc Smile)

6Bài 1- Buổi 4 Empty Re: Bài 1- Buổi 4 Tue Nov 20, 2012 12:15 pm

Admin


Admin
Admin
lúc trước có add nút thanks mà nó phiền quá nên remove roài kè kè

https://javasupport.forumvi.com

7Bài 1- Buổi 4 Empty lỡ hỏi rồi hỏi luôn Tue Nov 20, 2012 10:50 pm

m1_huy


Vịt mới lớn
Vịt mới lớn
cái hèm setL mình vẫn chưa hiểu lắm
tại sao phải dùng con trỏ this
this.n=n chi vậy bạn

rùi còn hàm tĩnh private static class bai1 có cần thiết ko?

sao myPane phải extends từ JPanel mà ko phải cái khác, như JLabel hay JFrame chẳng hạn

8Bài 1- Buổi 4 Empty Re: Bài 1- Buổi 4 Wed Nov 21, 2012 9:14 am

Admin


Admin
Admin
Chào bạn,
Trong hàm setL, mình truyền vào tham số là n, và trong class myPane cũng có 1 biến là n. this.n chỉ là cho nó hiểu, n nào là của class, n nào là của phương thức!

Nếu bạn kô thích xài như vậy, bạn có thể làm như sau:
setL(int x){
n=x;
}

Còn việc hàm tĩnh có cần thiết hay không là ở bạn thôi ^^, tuỳ theo cách dùng.

Theo tui được biết thì chỉ có thể vẽ ảnh trên JPanel , JRootPane , Container .
Còn những cái như bạn vừa nêu JLabel,JFrame thì mỗi cái có 1 chức năng riêng của nó rồi. Mỗi một hiển thị phải chỉ là 1 frame. Ví dụ, bạn đang ở 1 frame chính, khi bạn muốn tạo 1 frame hộp thoại thì bạn phải dùng 1 cái JDialog.

Có thể những hiểu biết của tui là sai, tại cũng chỉ mới tập tành về GUI, nên chưa hiểu rõ lắm, chỉ đủ để làm những bài tập nhỏ. Có gì các bác chém nhẹ tay @@!

Thân, chúc bạn học tốt!

https://javasupport.forumvi.com

9Bài 1- Buổi 4 Empty Re: Bài 1- Buổi 4 Wed Nov 21, 2012 10:45 am

m1_huy


Vịt mới lớn
Vịt mới lớn
nếu mình chơi kiểu n=x thì làm vậy phải ko ta?
Code:

 public void setL(int x){
        n=x;
        x1=0; y1=250;
        x2=200; y2=0;
        x3=400; y3=250;
    }

bỏ this. đi hết đúng ko nhỉ

10Bài 1- Buổi 4 Empty Re: Bài 1- Buổi 4 Wed Nov 21, 2012 12:23 pm

m1_huy


Vịt mới lớn
Vịt mới lớn
cho mình hỏi xíu nữa

sao mình tạo ra top_lb rồi lại ko add vô frame

vậy thằng top_lb này nó nằm ở đâu???

sao trong class myPaint mình tạo 2 phương thức create với paintComponent lại ko thể sử dụng trực tiếp, như là sử dụng trực tiếp với setL mà lại phải sử dụng gián tiếp thông qua repaint???

có thể dùng create để vẽ trực tiếp đc ko

11Bài 1- Buổi 4 Empty Re: Bài 1- Buổi 4 Wed Nov 21, 2012 12:37 pm

Admin


Admin
Admin
Chào bạn,
sorry bạn, cái top_lb ban đầu định tạo ra để vẽ (do chưa hiểu), sau đó mới biết là vẽ trực tiếp trên frame, nên làm tiếp mà quên xoá ^^. tob_lb trong bài trên kô có tác dụng gì cả Very Happy

Thứ 2, phần gọi create thì có thể gọi trực tiếp hay gián tiếp. Nhưng phân như vậy sẽ dễ dàng hơn, vì lúc truyền tham số sẽ bớt cực^^!

Thân,

https://javasupport.forumvi.com

12Bài 1- Buổi 4 Empty Re: Bài 1- Buổi 4 Wed Nov 21, 2012 1:18 pm

m1_huy


Vịt mới lớn
Vịt mới lớn
ồh, thì ra là vậy,hehe

mình thử dùng thằng create để vẽ thì lúc truyền tham số Graphics g cuối cùng nó báo lỗi,chả biết truyền cách nào

cái Dimension mình set (410,350) lúc show hình ra nó bị thiếu, mất 1 góc tam giác bên phải, nếu set 440,350 thì đủ, chả hiểu tại sao trong khi tọa độ của mình chỉ nằm trong x=400,y=250 đổ lại thôi mà ta,sao lại bị thiếu đc nhỉ

13Bài 1- Buổi 4 Empty Re: Bài 1- Buổi 4 Wed Nov 21, 2012 2:27 pm

Admin


Admin
Admin
Chào bạn, nếu bạn gặp vấn đề với code của bạn, thì bạn có thể up lên, mọi người có thể giúp bạn chỉ ra mấu chốt!
Thân,

https://javasupport.forumvi.com

Sponsored content


Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang  Thông điệp [Trang 1 trong tổng số 1 trang]

Permissions in this forum:
Bạn không có quyền trả lời bài viết