Невозможно отобразить изображение на Jpanel - PullRequest
1 голос
/ 28 ноября 2009

Я использую Netbeans GUI Builder, но теперь это немного сбивает с толку. Как я могу добавить изображение на панель? Я думаю, что я делаю это правильно, но это не появляется. Я думаю, что это должно быть в методе init (), но netbeans не позволяет мне изменять эту часть кода. Это код, который я добавил для изображения:

  //these four lines I added to add the image
        imageIcon = new ImageIcon("login_icon.png");
        image = new JLabel(imageIcon);
        image.setToolTipText("SGS Security");
        topPanel.add(image);

Мой класс начинается здесь:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Login.java
 *
 * Created on Oct 27, 2009, 8:34:15 PM
 */

package sgs;

import javax.swing.ImageIcon;
import javax.swing.JLabel;


public class Login extends javax.swing.JFrame {

    JLabel image;
    ImageIcon imageIcon;

    /** Creates new form Login */
    public Login() {
        initComponents();

  //these four lines I added to add the image
        imageIcon = new ImageIcon("login_icon.png");
        image = new JLabel(imageIcon);
        image.setToolTipText("SGS Security");
        topPanel.add(image);
    }



    /** 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() {

        topPanel = new javax.swing.JPanel();
        userLabel = new javax.swing.JLabel();
        passwordLabel = new javax.swing.JLabel();
        connectLabel = new javax.swing.JLabel();
        forgotPassLabel = new javax.swing.JLabel();
        forgotPassCheckBox = new javax.swing.JCheckBox();
        cancelButton = new javax.swing.JButton();
        okButton = new javax.swing.JButton();
        passwordTextField = new javax.swing.JTextField();
        userTextField = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setBackground(new java.awt.Color(216, 156, 60));

        topPanel.setBackground(new java.awt.Color(28, 90, 198));

        javax.swing.GroupLayout topPanelLayout = new javax.swing.GroupLayout(topPanel);
        topPanel.setLayout(topPanelLayout);
        topPanelLayout.setHorizontalGroup(
            topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 406, Short.MAX_VALUE)
        );
        topPanelLayout.setVerticalGroup(
            topPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 71, Short.MAX_VALUE)
        );

        userLabel.setText("User name:");

        passwordLabel.setText("Password:");

        connectLabel.setText("Connect to SGS");

        forgotPassLabel.setText("Forgot password");

        forgotPassCheckBox.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                forgotPassCheckBoxActionPerformed(evt);
            }
        });

        cancelButton.setText("Cancel");

        okButton.setText("OK");
        okButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                okButtonActionPerformed(evt);
            }
        });

        userTextField.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                userTextFieldActionPerformed(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()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(connectLabel)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(passwordLabel)
                        .addComponent(userLabel)))
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(userTextField)
                    .addComponent(passwordTextField)
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(forgotPassCheckBox)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(forgotPassLabel))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(32, 32, 32)
                        .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(28, 28, 28)
                        .addComponent(cancelButton, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
            .addComponent(topPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(topPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(27, 27, 27)
                .addComponent(connectLabel)
                .addGap(34, 34, 34)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(userLabel)
                    .addComponent(userTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(passwordLabel)
                    .addComponent(passwordTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(forgotPassLabel)
                    .addComponent(forgotPassCheckBox))
                .addGap(23, 23, 23)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cancelButton, javax.swing.GroupLayout.DEFAULT_SIZE, 31, Short.MAX_VALUE))
                .addContainerGap())
        );

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

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

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

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

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Login().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton cancelButton;
    private javax.swing.JLabel connectLabel;
    private javax.swing.JCheckBox forgotPassCheckBox;
    private javax.swing.JLabel forgotPassLabel;
    private javax.swing.JButton okButton;
    private javax.swing.JLabel passwordLabel;
    private javax.swing.JTextField passwordTextField;
    private javax.swing.JPanel topPanel;
    private javax.swing.JLabel userLabel;
    private javax.swing.JTextField userTextField;
    // End of variables declaration

}

Ответы [ 2 ]

1 голос
/ 28 ноября 2009

Откажитесь от GUI Builder и узнайте, как создавать GUI самостоятельно. Таким образом, вы тратите время на изучение Java вместо изучения IDE. Вероятно, существует некоторое свойство GroupLayout, которое не установлено должным образом, и, поскольку GroupLayout был разработан для использования IDE, а не людьми, я понятия не имею, в чем может быть проблема.

Другая возможность состоит в том, что IDE не может найти ваше изображение. Вы добавили System.out.println, чтобы отобразить изображение и убедиться, что оно не равно нулю.

Я предлагаю вам прочитать раздел из учебника по Swing на Как использовать значки для рабочего примера, который вы можете загрузить и протестировать, чтобы увидеть, работает ли он. Просто замените значки в руководстве на ваши значки, чтобы убедиться, что они найдены.

Edit:

После второго взгляда на код, я считаю, что мое первоначальное предложение верно. Вы пытаетесь добавить метку на панель, используя одну строку кода:

topPanel.add(image);

Посмотрите на код, сгенерированный IDE. Операторы добавления НЕ так просты. Если вы хотите вручную добавить компонент после факта, вам нужно прочитать раздел из учебника «Как использовать групповое размещение», чтобы понять различные ограничения и используемые методы.

Или вам нужно выяснить, как это сделать в IDE. Вот почему я предпочитаю сделать это самостоятельно. Тогда вы несете ответственность за код, а не IDE.

0 голосов
/ 28 ноября 2009

Это одно из странных поведений в Java (GUI). Вы можете вручную нарисовать изображение на панели.

Вот что я использую:

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2= (Graphics2D) g;

    if (currentImage != null) {
        g2.drawImage(currentImage, null, 0, 0);
    } 
}

Также вы должны создать компонент ImagePanel, который представляет собой JPanel, инкапсулирующий изображение.

Средний аргумент для drawImage равен нулю, поскольку я не собираюсь выполнять над ним операцию с изображением.

...