JComponents不显示与图片背景?

我的组件没有显示出来。 我该如何解决?

码:

import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.*; public class login implements ActionListener{ JTextField gusername; JTextField gpassword; static String username; static String password; void logini() throws IOException { JFrame window = new JFrame("Login"); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setSize(300, 250); window.setResizable(false); window.setVisible(true); JPanel mainp = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); window.add(mainp); BufferedImage myPicture = ImageIO.read(new File("c:\\bgd.png")); JLabel picLabel = new JLabel(new ImageIcon( myPicture )); mainp.add(picLabel, c); c.gridx = 0; c.gridy = 1; gusername = new JTextField(); gusername.setText("Username"); mainp.add(gusername, c); c.gridx = 0; c.gridy = 2; gpassword = new JTextField(); gpassword.setText(" password "); mainp.add(gpassword, c); c.gridx = 0; c.gridy = 3; JButton login = new JButton("Login"); mainp.add(login, c); login.addActionListener(this); login.setActionCommand("ok"); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equalsIgnoreCase("ok")){ try { this.username = (gusername.getText()); this.password = (gpassword.getText()); System.out.println("0"); } catch(NumberFormatException ex){ System.out.println("ERROR: Could not preform function: 7424"); } } } } 

结果:

这里先看这个小例子,让我知道你是否明白这里发生了什么。 那我们只能慢慢地再走一步。 试着通过这个例子,我正在向你展示如何在JPanel上绘图

 import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.*; public class PaintingExample { private CustomPanel contentPane; private void displayGUI() { JFrame frame = new JFrame("Painting Example"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); contentPane = new CustomPanel(); frame.setContentPane(contentPane); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String... args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new PaintingExample().displayGUI(); } }); } } class CustomPanel extends JPanel { private BufferedImage image; public CustomPanel() { setOpaque(true); setBorder(BorderFactory.createLineBorder(Color.BLACK, 5)); try { /* * Since Images are Application Resources, * it's always best to access them in the * form of a URL, instead of File, as you are doing. * Uncomment this below line and watch this answer * of mine, as to HOW TO ADD IMAGES TO THE PROJECT * http://stackoverflow.com/a/9866659/1057230 * In order to access images with getClass().getResource(path) * here your Directory structure has to be like this * Project * | * ------------------------ * | | * bin src * | | * --------- .java files * | | * package image(folder) * ( or | * .class 404error.jpg * files, if * no package * exists.) */ //image = ImageIO.read( // getClass().getResource( // "/image/404error.jpg")); image = ImageIO.read(new URL( "http://i.imgur.com/8zgHpH8.jpg")); } catch(IOException ioe) { System.out.println("Unable to fetch image."); ioe.printStackTrace(); } } /* * Make this one customary habbit, * of overriding this method, when * you extends a JPanel/JComponent, * to define it's Preferred Size. * Now in this case we want it to be * as big as the Image itself. */ @Override public Dimension getPreferredSize() { return (new Dimension(image.getWidth(), image.getHeight())); } /* * This is where the actual Painting * Code for the JPanel/JComponent * goes. Here we will draw the image. * Here the first line super.paintComponent(...), * means we want the JPanel to be drawn the usual * Java way first (this usually depends on the opaque * property of the said JComponent, if it's true, then * it becomes the responsibility on the part of the * programmer to fill the content area with a fully * opaque color. If it is false, then the programmer * is free to leave it untouched. So in order to * overcome the hassle assoicated with this contract, * super.paintComponent(g) is used, since it adheres * to the rules, and performs the same task, depending * upon whether the opaque property is true or false), * then later on we will add our image to it, by * writing the other line, g.drawImage(...). */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, this); } } 

编译和运行:

  1. 启动命令提示符/terminal/ cmd。 然后移至Project文件夹引用的位置
  2. 现在使用以下代码编译代码:

    C:\ Project> javac -d bin src \ *。java

  3. 现在通过发出命令移动到bin文件夹:

    C:\ Project> cd bin

  4. 一旦进入bin文件夹,发出以下命令来运行:

    C:\ Project \ bin> java PaintingExample

以下是使用JLabel作为图像基础的代码:

 import java.awt.*; import java.net.MalformedURLException; import java.net.URL; import javax.swing.*; public class LabelExample { private JPanel contentPane; private JLabel imageLabel; private void displayGUI() { JFrame frame = new JFrame("Label Example"); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); contentPane = new JPanel(); contentPane.setOpaque(true); contentPane.setBorder( BorderFactory.createLineBorder(Color.BLACK, 5)); //imageLabel = new JLabel( // new ImageIcon( // getClass().getResource( // "/image/404error.jpg"))); try { imageLabel = new JLabel(new ImageIcon( new URL("http://i.imgur.com/8zgHpH8.jpg"))); } catch(MalformedURLException mue) { System.out.println( "Unable to get Image from" + "the Resource specified."); mue.printStackTrace(); } contentPane.add(imageLabel); frame.setContentPane(contentPane); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public static void main(String... args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new LabelExample().displayGUI(); } }); } } 

这是上面两个代码的输出:

404Error

 window.setVisible(true); should be invoked only after all the components have been added to the frame. void logini() throws IOException { JFrame window = new JFrame("Login"); JPanel mainp = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); window.add(mainp); BufferedImage myPicture = ImageIO.read(new File("c:\\bgd.png")); JLabel picLabel = new JLabel(new ImageIcon( myPicture )); mainp.add(picLabel, c); c.gridx = 0; c.gridy = 1; gusername = new JTextField(); gusername.setText("Username"); mainp.add(gusername, c); c.gridx = 0; c.gridy = 2; gpassword = new JTextField(); gpassword.setText(" password "); mainp.add(gpassword, c); c.gridx = 0; c.gridy = 3; JButton login = new JButton("Login"); mainp.add(login, c); login.addActionListener(this); login.setActionCommand("ok"); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setSize(500, 250); window.setResizable(false); window.setVisible(true); }