Làm sao truyền giá trị dữ liệu qua lại giữa các class ???

15/1/12
41
5
8
Nếu mình muốn truy nhập các biến hay giá trị dữ liệu giữa các lớp với nhau mình cần viết hàm để làm điều này.

vd: mình có 2 lớp:
1/ testUserInterface class


PHP:
private JButton btnStart, btnExit;
private JLabel lblSearch;
private JTextField txtSearch;
private JPanel sContent;
private TestSearch ts;

[COLOR=#000000][COLOR=#40a0ff]// Build Components for Search[/COLOR]
        sContent = new JPanel(); // content Panel to display
        sContent.setLayout( new FlowLayout()); 
        lblSearch =  new JLabel("Search");
        txtSearch = new JTextField(20);
        btnStart = new JButton("Start");
        btnExit = new JButton("Exit");
        ts = new testSearch();

       [COLOR=#8080ff] // add action handling for 2 buttons[/COLOR]
        btnStart.addActionListener(ts);
        btnExit.addActionListener(ts);

        [COLOR=#0000bf]//Add components to Search Panel [/COLOR]
        sContent.add(lblSearch);
        sContent.add(txtSearch);
        sContent.add(btnStart);
        sContent.add(btnExit);
        searchPhotoPanel.add(sContent, BorderLayout.CENTER);[/COLOR]
2/ testSearch class

PHP:
    public testSearch()
    {    }

    public void init()
    {
        pp = new PhotoPanel();
        pp.setLayout(new FlowLayout());
        searchPhotoPanel.add(pp, BorderLayout.SOUTH);
        pp.setVisible(true);
        pf = new PhotoFinder();
        photoList = new ArrayList<Photo>();
        originalKeyWord = "";
        oldKeyWord = "";
        //titles = new ArrayList<String>();
        timer = new Timer(1000, this);
        //btnStart = new JButton("Search");
        pack();
        setVisible(true);
    }
    @Override
    public void actionPerformed(ActionEvent e)
    {

        if (e.getActionCommand().equals("Exit"))
        {
                System.exit(0);
        }
        if (e.getActionCommand().equals("btnStart"))
        {
            if (timer.isRunning())
            {
                timer.stop();
            }
            keyWord = txtSearch.getText();
            originalKeyWord = keyWord;
            oldKeyWord = keyWord;
            timer.start();
        }}
Mình đc gợi ý đai loại như viết 1 hàm để truyền dữ liệu cho các lớp với nhau
Trong lớp testUserInterface viết 1 hàm

PHP:
getSearchBox()
=> hàm trả về đối tượng txtSearch và hàm này nên đc để là public và trả về đối tượng JTextField

Như vậy đại loại theo mình hiểu là

PHP:
public void getSearchBox()
{}
vậy làm sao trả về đối tượng txtSearch trong này????
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,637
310
83
public JTextField getSearchBox(){
return this.txtSearch;
}
 
15/1/12
41
5
8
Cám ơn bạn Nancru,

Mình đã thêm thắt vào rồi nhưng xảy lỗi báo như sau:

PHP:
java.lang.StackOverflowError
    at java.awt.Insets.<init>(Insets.java:103)
    at sun.awt.windows.WToolkit.getScreenInsets(Native Method)
    at sun.awt.windows.WToolkit.getScreenInsets(WToolkit.java:567)
    at java.awt.Window.init(Window.java:498)
    at java.awt.Window.<init>(Window.java:536)
    at java.awt.Frame.<init>(Frame.java:420)
    at java.awt.Frame.<init>(Frame.java:385)
    at javax.swing.JFrame.<init>(JFrame.java:180)
    at testUserInterface.<init>(testUserInterface.java:65)
    at testSearch.<init>(testSearch.java:29)
    at testUserInterface.<init>(testUserInterface.java:168)
Ở dòng 29 ở lớp testSearchthì báo lỗi ở public testSearch()

Ở dòng 168 ở testUserInterface thì báo lỗi ở ts = new testSearch();

Mình gửi kèm file source code, vì dài quá 10000 chữ, ko post đc.

Mình sử dụng chương trình BlueJ để tập dợt code, nếu các bạn sử chương trình khác như Netbean, Eclipes,... thì mở các file có đuôi .java nhé
 

Attachments

SITUVN

Well-Known Member
25/2/12
967
263
63
Lỗi này xảy ra khi có một thành phần gọi chính nó vô tận, mình vừa bị hôm qua khi viết bằng C#, mình gọi toán tử, bên trong nó, mình lại gọi nó 1 lần nữa => mãi mãi ko kết thúc.
Javascript thì mình cũng bị nhiều :)).
Tình trạng là như thế này:
PHP:
public void InfiniteLoop() {
    InfiniteLoop();
}
 

SITUVN

Well-Known Member
25/2/12
967
263
63
Bạn thử làm 1 phương thức giống như vậy đi. Nó chỉ có bấy nhiêu thôi (3 dòng) là đủ gây lỗi rồi.

Chính nó gọi nó.
 

SITUVN

Well-Known Member
25/2/12
967
263
63
Lớp gây lỗi đơn giản:

PHP:
class StackError {
    public static void main(String[] args) {
        StackError.InfiniteLoop();
    }

    public static void InfiniteLoop() {
        InfiniteLoop();
    }
}
Vậy là đủ để có lỗi rồi. Lõi này chỉ xảy ra khi chạy, khi biên dịch sẽ ko có vấn đề gì.
 

Nancru

CongDongJava Project Leader
Staff member
9/10/11
1,637
310
83
Code:
    public testSearch() 
    {
        getSearchBox();
    }
Cái constructor này để làm gì vậy ??

Cái constructor của lớp testUserInterface có vấn đề khi đi new đối tượng extends nó.
A extends a.
new A kéo theo A gọi constructor của a(vấn đề thừa kế)
constructor a được gọi lại đi new constructor A.
new A tiếp tục kéo theo A gọi constuctor của a.

tiếp tục như thế cho đến khi phát sinh lỗi.
 
15/1/12
41
5
8
cám ơn bạn rất nhiều, mình vừa đc 1 bạn ở 4rum khác khuyên hướng mình đi sai, h phải làm lại cho phù hợp lại.

nếu kéo dài vô hạn n hư thế này nó làm tốn memory và phương hướng cũng sai.

mình mò lại rùi (^^)