Java 添加组件时删除图像

Java 添加组件时删除图像,java,image,swing,applet,components,Java,Image,Swing,Applet,Components,我目前在JFrame和图像方面有问题。该程序使用一个小程序,然后将其添加到另一个类中的JFrame中,因此它可以作为小程序或应用程序运行。目前,该框架仅容纳少量图像,没有任何组件。我最近尝试使用绝对定位(LayoutManger为null)添加一个JTextField,它工作正常,只是删除了所有图像,只剩下一个JTextField。为什么会这样?我怎样才能修好它?我的代码贴在下面。谢谢 主类(创建小程序和图像): JFrame类(创建JFrame并添加小程序): 看看这个例子,看看这是否有帮助。

我目前在JFrame和图像方面有问题。该程序使用一个小程序,然后将其添加到另一个类中的JFrame中,因此它可以作为小程序或应用程序运行。目前,该框架仅容纳少量图像,没有任何组件。我最近尝试使用绝对定位(LayoutManger为null)添加一个JTextField,它工作正常,只是删除了所有图像,只剩下一个JTextField。为什么会这样?我怎样才能修好它?我的代码贴在下面。谢谢

主类(创建小程序和图像):

JFrame类(创建JFrame并添加小程序):


看看这个例子,看看这是否有帮助。有关上述主题的一些信息,请参见此。如果还有不清楚的地方,请告诉我

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class BackgroundExample {

    private JTextField tField;
    private JButton button;

    private CustomPanel contentPane;

    private void displayGUI() {
        JFrame frame = new JFrame("Background Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new CustomPanel();
        contentPane.setLayout(new GridBagLayout());

        JPanel componentPanel = new JPanel();
        componentPanel.setOpaque(false);
        tField = new JTextField("Nothing to display yet...", 20);
        button = new JButton("Click me not!");
        componentPanel.add(tField);
        componentPanel.add(button);

        contentPane.add(componentPanel);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new BackgroundExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class CustomPanel extends JPanel {

    private BufferedImage bImage;

    public CustomPanel() {
        try {
            bImage = ImageIO.read(new URL("http://i.imgur.com/fHiBMwI.jpg"));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return (bImage != null ? new Dimension(
            bImage.getWidth(), bImage.getHeight()) : new Dimension(400, 400));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(bImage, 0, 0, this);
    }
}

JApplet很可能是不透明的,另一个问题是混合了重量和重量轻的组件,这就出现了z顺序问题。更好的解决方案是将应用程序逻辑与容器分离,这样您就可以在顶级容器之间简单地移动它……您还应该知道,小程序具有非常严格的权限,这意味着,它不太可能访问本地驱动器“。我最近尝试使用绝对定位(LayoutManger为null)添加JTextField,它工作正常,但删除了所有图像“你对‘工作正常’有一个奇怪的定义。我以前使用过绝对定位,没有任何问题。直到最近才发生这种情况。不确定是我的课程设置还是什么。我认为这与定位无关。提示:1)添加@MadProgrammer(或其他任何人-the@很重要)以通知他们新的评论。2) 尝试在两台或多台机器上,在可调整大小的GUI中的两个或多个PLAF中测试“works fine”空布局。3) 不要对皈依者说教。(布局规则)。4) 为了更快地获得更好的帮助,发布一个(MCTRE)。@MadProgrammer,你能编辑我的代码并告诉我你的意思吗?我很难理解,一个直观的例子真的会有帮助。@NicholasCreech:非常欢迎你,并保持微笑:-)只需要记住一点,以前程序访问图像的方式,如果程序转移到其他计算机上,图像将必须放在桌面上指定的位置,虽然在本例中,当您创建一个jar文件时,这种情况不会发生。
package net.xenix.src ;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class XenixApplicationWindow extends JFrame
{
private static final long serialVersionUID = 1L;

static XenixMain xenix = new XenixMain();

static ImageIcon xenixIcon = new ImageIcon(XenixMain.imagePath + "XenixIcon.png");

public static void main(String[] args)
{
    new XenixApplicationWindow();
}

public XenixApplicationWindow()
{
    JFrame frame = new JFrame();
    JTextField userInput = new JTextField(15);
    JPanel panel1 = new JPanel(null);
    frame.add(xenix);
    frame.setSize(1600, 900);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setResizable(true);
    frame.setIconImage(xenixIcon.getImage());
    userInput.setBounds(0, 0, 120, 10);
    panel1.add(userInput);
    frame.add(panel1);

    frame.setContentPane(panel1);

    frame.setLocationRelativeTo(null);
    frame.setTitle("Xenix");

    xenix.init();
    xenix.start();

    frame.setVisible(true);
}
}
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

public class BackgroundExample {

    private JTextField tField;
    private JButton button;

    private CustomPanel contentPane;

    private void displayGUI() {
        JFrame frame = new JFrame("Background Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        contentPane = new CustomPanel();
        contentPane.setLayout(new GridBagLayout());

        JPanel componentPanel = new JPanel();
        componentPanel.setOpaque(false);
        tField = new JTextField("Nothing to display yet...", 20);
        button = new JButton("Click me not!");
        componentPanel.add(tField);
        componentPanel.add(button);

        contentPane.add(componentPanel);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new BackgroundExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class CustomPanel extends JPanel {

    private BufferedImage bImage;

    public CustomPanel() {
        try {
            bImage = ImageIO.read(new URL("http://i.imgur.com/fHiBMwI.jpg"));
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return (bImage != null ? new Dimension(
            bImage.getWidth(), bImage.getHeight()) : new Dimension(400, 400));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(bImage, 0, 0, this);
    }
}