làm sao trình bày 1 cái interface phụ có chức năng vào trong interface chính trình bày giao diện

15/1/12
41
5
8
Mình có 2 interface như sau:
UserInterface => dùng để trình bày giao diện và tương tác với các menu, sub-menu
SearchInterface => chứa giao diện dùng để truy tìm thông tin.

hình biểu tượng như sau:



Khó khăn của mình là h ko nhồi nhét đc thằng SearchInterface vào trong UserInterface đc ???
Textfield và 2 nút button Start và Exit trong SearchInterface ko hiển thị trong UserInterface, ko những thế, label của searchPhotoPanel nằm trong UserInterface cũng mất tiêu.

bạn nào có thể cho mình giải pháp đc ko ????

cám ơn rất nhiều.
 
15/1/12
41
5
8
mình ko đủ chỗ để post source code của mình đành up lên chỗ này:

Code của UserInterface:

PHP:
/**
 * This class contains all interfaces and some event handling functions
 * 
 * @author Hung Vu Pham
 * @version 1, 3/12/2012
 * @version 2, 5/12/2012
 */

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.KeyStroke;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

import java.util.*;
import java.io.*; //for writing and reading file

public class UserInterface extends JFrame implements ActionListener
{
/**
 * @param Declaring all components for user interface
 * @param Firslty, to declare components of menu such as
 * @param JMenuBar to create a menu bar
 * @param JMenu to create a menu on the menu bar such as menu File.
 * @param JMenuItem to create a submenu of the menu such as fExit is a submenu of menu File.
*/    
    private JMenuBar menuBar;
    private JMenu file, menu, help;
    private JMenuItem fExit, mUpload, mRecentPhoto, mSearch, hGuide, hAuthor;
    public JPanel upperPanel, centerPanel, InforPanel,imgPanel, recentPhotoPanel, searchPhotoPanel;
    private JLabel welcome, lWelcome, lAbout, recentPhotoTitle, searchTitle;
    
    ImageIcon iWelcome = new ImageIcon("IMAGE/flickr.jpg", "Flickr Image");
    ImageIcon iAbout = new ImageIcon("IMAGE/FairyTail.jpg", "Fairy Tail Team");
    
    public UserInterface ()
    {
        
        //Add regular components to the window, using the default BorderLayout.
        Container contentPane = getContentPane(); //the app window        
        // create upper panel to hold menu bar on the top of interface
        upperPanel = new JPanel();
        contentPane.add(upperPanel, BorderLayout.NORTH);
        upperPanel.setLayout(new BorderLayout());
        // Create menu bar to hold menus and submenus
        menuBar = new JMenuBar();
        //add menu bar to the top of interface
        upperPanel.add(menuBar);      
            
        // Build File menu and its short-cut key
        file = new JMenu ("File");        
        file.setMnemonic(KeyEvent.VK_F);
        file.getAccessibleContext().setAccessibleDescription(
            "File related operations");
        // Create a submenu for File menu and ist short-cut key
        fExit = new JMenuItem ("Exit", KeyEvent.VK_E);
        fExit.addActionListener(this);
        // add components of File menu
        menuBar.add(file);
        file.add(fExit);
        
        // Build  Menu menu and its short-cut key
        menu = new JMenu ("Menu");        
        menu.setMnemonic(KeyEvent.VK_M);
        menu.getAccessibleContext().setAccessibleDescription(
            "Menu related operations");
        // Create submenus for Menu menu and its short-cut key
        mRecentPhoto = new JMenuItem ("Check Recent Photos", KeyEvent.VK_C);
        mSearch = new JMenuItem ("Search Photos", KeyEvent.VK_S);
        // add components of File menu
        menuBar.add(menu);
        menu.add(mRecentPhoto);
        mRecentPhoto.addActionListener(this);
        menu.addSeparator();
        menu.add(mSearch);
        mSearch.addActionListener(this);
        
        // Build  Help Menu and its short-cut key
        help = new JMenu ("Help");     
        help.setMnemonic(KeyEvent.VK_H);
        help.getAccessibleContext().setAccessibleDescription(
            "Help related operations");
        // Create submenus for Help Menu and their short-cut key
        hGuide = new JMenuItem ("Short-Cut Key Guide", KeyEvent.VK_S);
        hAuthor = new JMenuItem ("About Us", KeyEvent.VK_A);
        // add components of help menu
        menuBar.add(help);
        help.add(hGuide);
        hGuide.addActionListener(this);
        help.addSeparator();
        help.add(hAuthor); 
        hAuthor.addActionListener(this);
        
        // Build Center Panel which is stayed in the center of interface.
        centerPanel = new JPanel();
        centerPanel.setLayout (new FlowLayout());
        contentPane.add(centerPanel, BorderLayout.CENTER);      
        
        // Build Infor Panel and display Image and Text.
        InforPanel = new JPanel();
        InforPanel.setLayout (new BorderLayout());
        centerPanel.add(InforPanel);
        // Build components for Infor Panel
        welcome = new JLabel ("Welcome to Java Flickr Application", JLabel.CENTER);
        InforPanel.add(welcome, BorderLayout.NORTH );
        lWelcome = new JLabel (iWelcome);   
        InforPanel.add(lWelcome);
        
        //Build recent Photo Panel to display most recent photos
        recentPhotoPanel = new JPanel();
        recentPhotoPanel.setLayout (new BorderLayout());
        recentPhotoPanel.setVisible(false);
        recentPhotoTitle = new JLabel ("Most Recent Photos on Flickr");
        recentPhotoPanel.add(recentPhotoTitle);
        centerPanel.add(recentPhotoPanel);
        
        //Build Search Panel to display area where user can search photos with a keyword
        searchPhotoPanel = new JPanel ();
        searchPhotoPanel.setLayout (new BorderLayout());
        searchPhotoPanel.setVisible(false);
        searchTitle = new JLabel ("Welcome to Search Area");
        searchPhotoPanel.add(searchTitle);
        centerPanel.add(searchPhotoPanel);
    }
 
    public static void main (String arg[])
    {
        UserInterface userFace = new UserInterface ();
        userFace.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        userFace.setTitle("Java Flickr Application");
        userFace.setSize(800,600);
        userFace.setVisible(true);
    }
/**
 * Handling with user selection with actionPerformed.
*/ 
    public void actionPerformed(ActionEvent e) 
    { 
        JMenuItem source = (JMenuItem)(e.getSource());
        //If user selects "Short-cut Key Guide" sub-menu, a dialog will be shown
        if (source.equals(hGuide))
        {
                
                        JOptionPane.showMessageDialog( UserInterface.this,
                        "Select appropriate menu option that you want from Java Flickr Application\n" +
                        "User should navigate to menu before submenu\n" +
                        "Alt + F => select File menu \n" +
                        "Alt + E => select Exit submenu \n" +
                        "Alt + M => select Menu menu \n" +
                        "Alt + C => select Check Recent Photos submenu \n" +
                        "Alt + S => select Search submenu \n" +
                        "Alt + H => select Help menu \n" +
                        "Alt + S => select Short-cut Key Guide submenu \n" +
                        "Alt + A => select About Us submenu \n" ,
                        "Help Contents", JOptionPane.PLAIN_MESSAGE);
                
        }
        //If user selects "About Us" sub-menu, a dialog will be shown
        if (source.equals(hAuthor))
        {
            JOptionPane.showMessageDialog( UserInterface.this,
                        "Java Flickr Application is created by Fairy Tail Group \n\n" +
                        "Hung Vu Pham\n\n" +
                        "Jennifer Naiaretti\n\n" +
                        "Panagiota Tzana\n\n" + 
                        "Athina Ioannou",
                        "About", JOptionPane.PLAIN_MESSAGE, iAbout);
        }
        //If user selects "Check Recent Photos" sub-menu, a panel to retrieve all photos from Flickr and display photos 
        if (source.equals(mRecentPhoto))
        {
            InforPanel.setVisible(false);
            searchPhotoPanel.setVisible(false);
            recentPhotoPanel.setVisible(true);
            // functions to retrieve most recent photos on Flickr will be display below
        }
        //If user selects "Search Photos" sub-menu, a panel to help user search photos on Flickr with specific keyword
        //This panel also contains all photo after searching.
        if (source.equals(mSearch))
        {
            InforPanel.setVisible(false);
            recentPhotoPanel.setVisible(false);
            searchPhotoPanel.setVisible(true);
            // functions to search photos with specific keyword on Flickr will be display below
            JPanel wG = new JPanel();
            searchPhotoPanel.add(wG);
        }
        //If "Exit" sub-menu is selected, a window closes.
        if (source.equals(fExit))
        {
            dispose();
            System.exit(0);
        }
    }
}
 
15/1/12
41
5
8
Code của searchInterface:

PHP:
/**
 * Write a description of class SearchInterface here.
 * 
 * @author Athina Ioannou 
 * @version 6/12/12
 */
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import javax.swing.*;
import com.aetrion.flickr.*;        // For FlickrJ classes.
import com.aetrion.flickr.photos.*;

public class SearchInterface extends UserInterface implements ActionListener{
    private PhotoPanel pp;
    private String keyWord;
    private String photoUrl;
    private PhotoFinder pf;
    private Timer timer;
    private JButton btnStart;
    private JButton btnExit;
    private JLabel lblSearch;
    private JTextField txtSearch;
    private Container contentPane;
    private ArrayList<Photo> photoList;
    private String originalKeyWord, oldKeyWord;
    /**
     * Creates new form SearchInterface
     */
    public SearchInterface() {
        
       // super("Flickr Stream");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(500, 300));
        contentPane = this.getContentPane();
        pf = new PhotoFinder();
        photoList = new ArrayList<Photo>();
        originalKeyWord = "";
        oldKeyWord = "";
        //titles = new ArrayList<String>();
        timer = new Timer(1000, this);
        init();
        this.pack();
        this.setVisible(true);
    }

    
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        
        if (e.getSource() == btnExit)
        {
            System.exit(0);
        }
        if (e.getSource() == btnStart)
        {
            if (timer.isRunning())
            {
                timer.stop();
            }
            keyWord = txtSearch.getText();
            originalKeyWord = keyWord;
            oldKeyWord = keyWord;
            timer.start();
        }
        else
        {
            if (keyWord != null)
           {
               Random r = new Random();
                photoList.clear();
                
                photoList = pf.doQuery(keyWord);
                int i = r.nextInt(photoList.size());
                pp.setImage(photoList.get(i).getSmallUrl());
                keyWord = photoList.get(i).getTitle();
                Iterator it = photoList.iterator();
                while (keyWord.equals("")) 
                {
                    Photo p = (Photo)it.next();
                    keyWord = p.getTitle();
                }
               // if (oldKeyWord.equals(keyWord))
                //{
                   // keyWord = originalKeyWord;
                   // }
                //oldKeyWord = keyWord;
                keyWord = originalKeyWord;
                {
                     //int num = photoList.size();
                //for (int k=1; k< num; k++)
                pp.repaint();
            }
            System.out.println(keyWord);
        }}
    }
    
    public void init(){
        pp = new PhotoPanel();
        JPanel wG = new JPanel();
        wG.setLayout(new FlowLayout());
        lblSearch = new JLabel("Search");
        txtSearch = new JTextField(20);
        btnStart = new JButton("Start");
       btnExit  = new JButton("Exit");
       btnStart.addActionListener(this);
       btnExit.addActionListener(this);
       wG.add(lblSearch);
        wG.add(txtSearch);
        wG.add(btnStart);
        wG.add(btnExit);
        contentPane.add(wG, BorderLayout.NORTH);
        contentPane.add(pp, BorderLayout.CENTER);
    }
}
Xin các bạn giúp đỡ
 

SITUVN

Well-Known Member
25/2/12
967
263
63
Uây, cho mình cai thư viện FlickJ, mình tải cái FlickJ 1.2 về mà ko có một số lớp trong đó. Chẳng biết đúng ko :|

-------------------------------------------------------

Thôi :D
Thì ra là thiếu 2 lớp PhotoPanel PhotoFind của bạn =))
 

SITUVN

Well-Known Member
25/2/12
967
263
63
Vấn đề mình đã giải quyết được 1 ít rồi.
Đã cho hiện được những gì kế thừa. Nhưng khi nhấn vào các item trên menu thì chẳng có gì xảy ra. Kiểm tra thì tháy bạn đã ghi đè actionPerformed(ActionEvent) mà không super.actionPerformed(ActionEvent).
 
15/1/12
41
5
8
đây là code của PhotoFinder

PHP:
import java.util.*;                // For collections and properties.
import java.io.*;                  // For file handling.
import javax.xml.parsers.*;        // For properties file parsing.
import org.xml.sax.*;              // For Flickr REST parsing.
import com.aetrion.flickr.*;        // For FlickrJ classes.
import com.aetrion.flickr.photos.*;
/**
* Write a description of class PhotoFinder here.
*
* @author athina ioannou
* @version 6/12/12
*/
public class PhotoFinder
{
    private Flickr flickr;                  // Object providing link with Flickr.
    private ArrayList<String> photoURLs;    // Stores a list of photo URLs
    private ArrayList<String> titles;

    /** Sets up the Flickr connection and performs a simple query.
      */
    public PhotoFinder()
    {
        initFlickrConnection();

    }

      /** Initialises the connection with the Flickr service by using API key
      * and secret stored in a local properties file.
      * @return True if Flickr connection successfully established.
      */
    private boolean initFlickrConnection()
    {
                // Extract the API key and secret from a local properties file.
        Properties properties = null;
        try
        {
            properties = new Properties();
            properties.load(new FileInputStream("flickr.properties"));
        }
        catch (IOException e)
        {
            System.err.println("Problem reading flickr properties file.");
            return false;
        }

        // Make connection to the Flickr API.
        try
        {
            flickr = new Flickr(properties.getProperty("apiKey"),
                                properties.getProperty("secret"),
                                new REST());
        }
        catch (ParserConfigurationException e)
        {
            System.err.println("Problem establishing link with Flickr API: "+e);
            return false;
        }
        Flickr.debugStream = false;

        return true;

    }

    /** Performs a simple non-authenticated query of the Flickr service.
      * @return True if query performed successfully.
      */
    //from here below it matters
    public ArrayList<Photo> doQuery(String keyWord)
    {
        // Provides access to Flickr's 'photos' API calls.
        PhotosInterface photoInt = flickr.getPhotosInterface();

        // Handles a collection of photos returned by a query.
        PhotoList photoList =  null;

        SearchParameters criteria = new SearchParameters();

        criteria.setText(keyWord);
        try
        {

            photoList = photoInt.search(criteria, 100, 1);

        }
        catch (IOException e)
        {
            System.err.println("Problem with file transfer when performing Flickr query: "+e);
            return null;
        }
        catch (SAXException e)
        {
            System.err.println("Problem parsing Flickr query: "+e);
            return null;
        }
        catch (FlickrException e)
        {
            System.err.println("Problem performing flickr query: "+e);
            return null;
        }
        ArrayList<Photo> photos = new ArrayList<Photo>();
        // Now we have a list of photos, extract the photo URL from each photo in turn.
        for (Object obj : photoList)
        {
            // Contains information about an individual photo in the list.
            Photo photo = (Photo)obj;
            photos.add(photo);
            // Store the URL pointing to the small version of this photo.
            //photoURLs.add(photo.getSmallUrl());
        }
        return photos;
    }
 
}
Còn đây là code của PhotoPanel

PHP:
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
/**
* Write a description of class PhotoPanel here.
*
* @author Athina Ioannou
* @version 6/12/12
*/
public class PhotoPanel extends JPanel
{
    private BufferedImage img;
    /**
    * Creates new form PhotoPanel
    */
    public PhotoPanel() {

    }

    public void setImage(String url){
        try {
            URL imgUrl = new URL(url);
            img = ImageIO.read(imgUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //override paintComponent
    //
 
        public void paintComponent(Graphics g)
        {//
        super.paintComponent(g);
      g.drawImage(img, 0, 0, this);

    }
}


Cám ơn bro nhé, mình đang tò mò cái lớp kế thừa nhưng còn rất tơ mơ, mong bạn giúp đỡ nhiều



 
15/1/12
41
5
8
Còn đây là phần tự làm của mình theo phần kế thừa tự hiểu.

TestSearch.java

TestUserInterface.java

Mình khai báo giao diện searchInterface ở UserInterface luôn rồi cho cái nghe lệnh ActionPerformed cho nút start và exit ở bên searchInterface:

Đây là phần tự mò của mình bên UserInterface, mình lấy cái tên khác để khỏi bị nhầm nhọt.

đây là giao diện sau khi compile:



Tuy nhiên khi chạy thì ko có gì xảy ra, bên TerminalWindow thì hiển thị báo lỗi bên class testUserInterface.



Lỗi xảy ra ở thằng JMenuItem source

cái này làm mình điên đầu luôn,
 

SITUVN

Well-Known Member
25/2/12
967
263
63
Mình đã sửa lỗi này từ hôm qua, tưởng bạn đã biết cách sử, nên mình ko nói ;)).

actionPerformed(ActionEvent) của UserImterface bao toàn bộ nội dung trong biểu thức điều kiện sau:
PHP:
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() instanceof JMenuItem) { //Nó có kiểu JMenuItem...
          JMenuItem source = (JMenuItem)(e.getSource()); // thì mới ép về được
            //If user selects "Short-cut Key Guide" sub-menu, a dialog will be shown
            if (source.equals(hGuide)) {
            .........
        }
    }
Giải thích:
Khi bạn bấm vào nút Start (kiểu JButton), sự kiện actionPerformed(ActionEvent) sẽ xảy ra. Do bạn super.actionPerformed(ActionEvent) nên nó sẽ đưa sự kiện về cho lớp cha cùng kiểm tra. Trong sự kiện của lớp cha, bạn đã ko kiểm tra xem cái nguồn tạo sự kiện là kiểu gì mà bạn đã ép kiểu trực tiếp. Nút là JButton bạn lại ép về JItemMenu=> lỗi nhé.
 

SITUVN

Well-Known Member
25/2/12
967
263
63
Nói tóm lại là trước khi ép kiểu mà ko chắc là đối tượng cần ép là kiểu mình cần ép thì phải kiểm tra điều kiện bằng instanceof
 
15/1/12
41
5
8
cám ơn bạn SITUVN, đúng là mình còn rất tơ mơ, cám ơn bro nhé, cái instanceof đó của bạn giúp mình nhiều (^^).

h chỉ còn thiếu hình photo được trình bày trên giao diên nữa thôi là đc. mình lại mò tiếp
 
15/1/12
41
5
8
Mình có 1 giao diện như sau:



và có 4 class như sau:

testUserInterface => trình bày giao diện chương trình và các action handling
testSearch => trình bày action handling khi nhấn nút start và exit
photoPanel => hiển thị hình ảnh sau khi search
photoFinder => kết nối với trang web Flickr

Khi người dùng cho 1 keyword bất kì ví dụ như tiger chẳng hạn, rùi bấm nút start,

chương trình sẽ truy tìm hình ảnh trên trang web Flickr và trình bày trên giao diện.

Nhưng khi chạy chương trình, hình ảnh ko xuất hiện như dự kiến, quần thảo 1 hồi thì có vẻ như là vấn đề xảy ra đối với kế thừa hay sự tương tác các nút nhấn ko hợp lí.

Code của mình nằm trong folder ở trang Dropbox

https://www.dropbox.com/sh/hamf9bs09xhzm8z/coz8derN-x
 
15/1/12
41
5
8
Thanks, vấn đề đã đc giải quyết, mình xin admin đóng topic này lại dùm hay delete cũng đc.
cám ơn admin