无法在Jpanel上显示图像

时间:2009-11-28 01:26:06

标签: java user-interface swing netbeans awt

我正在使用Netbeans GUI构建器,但现在有点混乱。如何将图像添加到面板?我认为我做得对,但它没有出现。我认为它应该在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 个答案:

答案 0 :(得分:1)

抛弃GUI构建器并学习如何自己创建GUI。这样你就可以花时间学习Java而不是学习IDE。可能有一些GroupLayout属性没有正确设置,因为GroupLayout被设计为IDE而不是人类使用我不知道问题可能是什么。

另一种可能性是IDE无法找到您的图像。您是否添加了System.out.println以显示图像并确保其不为空。

我建议您阅读How to Use Icons上Swing教程中的部分,了解一个可以下载并测试它是否有效的工作示例。只需将教程中的图标替换为图标即可确保找到它们。

编辑:

在第二次查看代码后,我相信我的原始建议是正确的。您尝试使用一行代码将标签添加到面板:

topPanel.add(image);

查看IDE生成的代码。 add语句并不那么简单。如果您想在事后手动添加组件,那么您需要阅读“如何使用组布局”教程中的部分来理解所使用的各种约束和方法。

或者您需要弄清楚如何在IDE中执行此操作。这就是为什么我更喜欢自己做的方法。然后你负责代码,而不是IDE。

答案 1 :(得分:0)

这是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的中间争论是空的,因为我不打算对它进行图像操作。