Как предотвратить зависание моей формы при загрузке изображения из Интернета одним нажатием кнопки? - PullRequest
0 голосов
/ 25 декабря 2010

Я хочу отобразить изображение из Интернета на панели в другом Jframe одним нажатием кнопки, но всякий раз, когда я нажимаю кнопку, изображение сначала загружается, и в течение этого времени текущая форма потенциально зависает, и как только изображение загружается,форма отображается с изображением .. Как я могу избежать ситуации, когда моя форма зависает, так как она очень раздражает

Мои коды ::

Мой текущий класс

private void btn_TrackbusActionPerformed(java.awt.event.ActionEvent evt) {                                             
        try {
            sendMessage("Query,map,$,start,211,Arsenal,!");
            System.out.println(receiveMessage());
        } catch (UnknownHostException ex) {
            Logger.getLogger(client_Trackbus.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(client_Trackbus.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (Exception ex) {
            Logger.getLogger(client_Trackbus.class.getName()).log(Level.SEVERE, null, ex);
        }
        client_trackedbus nextform=new client_trackedbus(planform,connection,packet_receive,packet_send);
        this.setVisible(false);
        this.dispose();
        nextform.setVisible(true);
        // TODO add your handling code here:
    }                                            

Мой следующий класс, который отображает изображение

public class client_trackedbus extends javax.swing.JFrame {
    client_planform planform=null;
    DatagramSocket connection=null;
    DatagramPacket packet_receive=null;
    DatagramPacket packet_send=null;
    JLabel label=null;
    /** Creates new form client_trackedbus */
    public client_trackedbus(client_planform planform,DatagramSocket 
        connection,DatagramPacket packet_receive,DatagramPacket packet_send) {
        initComponents();
        this.planform=planform;
        this.connection=connection;
        this.packet_receive=packet_receive;
        this.packet_send=packet_send;
        try {
            displayMap("http://www.huddletogether.com/projects/lightbox2/images/image-2.jpg", jPanel1, new JLabel());
        } catch (MalformedURLException ex) {
            Logger.getLogger(client_trackedbus.class.getName()).log(Level.SEVERE, null, ex);
        }

    }


    private void displayMap(String url,JPanel panel,JLabel label) throws MalformedURLException{
        URL imageurl=new URL(url);
        Image image=(Toolkit.getDefaultToolkit().createImage(imageurl));
        ImageIcon icon = new ImageIcon(image);
        label.setIcon(icon);
        panel.add(label);
       // System.out.println(panel.getSize().width);
        this.getContentPane().add(panel);
    }


    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        btn_Exit = new javax.swing.JButton();
        btn_Plan = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Public Transport Journey Planner");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 368, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 172, Short.MAX_VALUE)
        );

        jLabel1.setFont(new java.awt.Font("Arial", 1, 18));
        jLabel1.setText("Your tracked bus");

        btn_Exit.setText("Exit");
        btn_Exit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_ExitActionPerformed(evt);
            }
        });

        btn_Plan.setText("Plan journey");
        btn_Plan.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_PlanActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(104, 104, 104)
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(65, 65, 65)
                        .addComponent(btn_Plan)
                        .addGap(65, 65, 65)
                        .addComponent(btn_Exit, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(20, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(35, 35, 35)
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btn_Exit)
                    .addComponent(btn_Plan))
                .addContainerGap(12, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void btn_ExitActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        Exitform();
    }                                        

    private void btn_PlanActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        this.setVisible(false);
        this.dispose();
         this.planform.setVisible(true);
    }                                        


    private void Exitform(){
        this.setVisible(false);
        this.dispose();

    }
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
               // new client_trackedbus().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btn_Exit;
    private javax.swing.JButton btn_Plan;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    // End of variables declaration                   

}

Ответы [ 2 ]

2 голосов
/ 25 декабря 2010

Вам определенно нужно использовать Swingworker, как предложил Trashgod. Чтобы прояснить эту связь, вот пример, который я настоятельно рекомендую вам попробовать. отметьте «Пример более сложного изображения» в этой ссылке и поймите код. это прекрасно решает вашу проблему. http://download.oracle.com/javase/tutorial/uiswing/components/icon.html

В частности, обратите внимание на этот бит кода:

 public IconDemoApp() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("Icon Demo: Please Select an Image");

    // A label for displaying the pictures
    photographLabel.setVerticalTextPosition(JLabel.BOTTOM);
    photographLabel.setHorizontalTextPosition(JLabel.CENTER);
    photographLabel.setHorizontalAlignment(JLabel.CENTER);
    photographLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

    // We add two glue components. Later in process() we will add thumbnail buttons
    // to the toolbar inbetween thease glue compoents. This will center the
    // buttons in the toolbar.
    buttonBar.add(Box.createGlue());
    buttonBar.add(Box.createGlue());

    add(buttonBar, BorderLayout.SOUTH);
    add(photographLabel, BorderLayout.CENTER);

    setSize(400, 300);

    // this centers the frame on the screen
    setLocationRelativeTo(null);

    // start the image loading SwingWorker in a background thread
    loadimages.execute();
}

вы можете видеть в этом конструкторе, как происходит отправка события отдельно от loadimages.execute (), которая использует работник Swing для загрузки изображений в фоновом режиме. Я буду рад уточнить любые сомнения.

1 голос
/ 25 декабря 2010

Форма будет остановлена, как только будет вызвана функция btn_TrackbusActionPerformed (). Форма не будет размораживаться до тех пор, пока btn_TrackbusActionPerformed () не вернется.

Решение состоит в том, чтобы btn_TrackbusActionPerformed () запустил поток и выполнил весь код, который в данный момент находится в btn_TrackbusActionPerformed (), асинхронно в новом потоке.

Обратите внимание, что у вас будут проблемы с безопасностью потоков при вызове Swing API в новом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...