Component removing images when added
Asked Answered
F

1

1

I am currently having a problem with JFrame and Images. This program uses an Applet then adds it to a JFrame in a different class, so it can be ran as either an Applet or an Application. Currently, the frame holds only a handful of images, and no components. I recently attempted to add a JTextField using absolute positioning (LayoutManger is null) and it works fine, except all the images are removed, leaving me with just a JTextField. Why is this happening? How can I fix it? My code is posted below. Thanks!

The Main Class (Creates the Applet and Images):

package net.xenix.src;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JComponent;
import javax.swing.Timer;

public class XenixMain extends JApplet implements ActionListener
{
private static final long serialVersionUID = 1L;

private static int pixelSize = 2;

public static Dimension size = new Dimension(1600, 900);
public static Dimension pixel = new Dimension(size.width / pixelSize, size.height /         pixelSize);

public static String name = "Xenix";

public static final int WIDTH = 1600;
public static final int HEIGHT = 900;

//Finding player Windows name
static String username = System.getProperty("user.name");

public static int secondsCount = 0;

//Shortcut to image directory
public static String imagePath = "C:\\Users\\" + username + "\\Desktop\\Xenix Dev\\Xenix\\resources\\graphics\\";

private static PaintSurface canvas;

public static ImageIcon XenixBackgroundIcon = new ImageIcon(imagePath + "XenixBackground.png");
public static Image XenixBackground = XenixBackgroundIcon.getImage();

public static ImageIcon XenixLogoIcon = new ImageIcon(imagePath + "XenixLogo.png");
public static Image XenixLogo = XenixLogoIcon.getImage();

public static ImageIcon HeartContainerFullIcon = new ImageIcon(imagePath + "HeartContainerFull.png");
public static Image HeartContainerFull = HeartContainerFullIcon.getImage();

public static ImageIcon HeartContainer9Icon = new ImageIcon(imagePath + "HeartContainer9.png");
public static Image HeartContainer9 = HeartContainer9Icon.getImage();

public static ImageIcon HeartContainer8Icon = new ImageIcon(imagePath + "HeartContainer8.png");
public static Image HeartContainer8 = HeartContainer8Icon.getImage();

public static ImageIcon HeartContainer7Icon = new ImageIcon(imagePath + "HeartContainer7.png");
public static Image HeartContainer7 = HeartContainer7Icon.getImage();

public static ImageIcon HeartContainer6Icon = new ImageIcon(imagePath + "HeartContainer6.png");
public static Image HeartContainer6 = HeartContainer6Icon.getImage();

public static ImageIcon HeartContainer5Icon = new ImageIcon(imagePath + "HeartContainer5.png");
public static Image HeartContainer5 = HeartContainer5Icon.getImage();

public static ImageIcon HeartContainer4Icon = new ImageIcon(imagePath + "HeartContainer4.png");
public static Image HeartContainer4 = HeartContainer4Icon.getImage();

public static ImageIcon HeartContainer3Icon = new ImageIcon(imagePath + "HeartContainer3.png");
public static Image HeartContainer3 = HeartContainer3Icon.getImage();

public static ImageIcon HeartContainer2Icon = new ImageIcon(imagePath + "HeartContainer2.png");
public static Image HeartContainer2 = HeartContainer2Icon.getImage();

public static ImageIcon HeartContainer1Icon = new ImageIcon(imagePath + "HeartContainer1.png");
public static Image HeartContainer1 = HeartContainer1Icon.getImage();

public static ImageIcon HeartContainerDepletedIcon = new ImageIcon(imagePath + "HeartContainerDepleted.png");
public static Image HeartContainerDepleted = HeartContainerDepletedIcon.getImage();

public static ImageIcon HealthTextIcon = new ImageIcon(imagePath + "HealthText.png");
public static Image HealthText = HealthTextIcon.getImage();

public static ImageIcon ForwardSlashIcon = new ImageIcon(imagePath + "ForwardSlash.png");
public static Image ForwardSlash = ForwardSlashIcon.getImage();

public Timer timer = new Timer(1000, this);

public void start()
{
    timer.setInitialDelay(0);
    timer.start(); 
}

public void stop()
{
    timer.stop();
}

public void actionPerformed(ActionEvent e)
{
    secondsCount++;

    System.out.println(secondsCount);
}

public void init()
{
    this.setSize(WIDTH, HEIGHT);
    canvas = new PaintSurface();
    this.add(canvas, BorderLayout.CENTER);

    ScheduledThreadPoolExecutor executor = 
        new ScheduledThreadPoolExecutor(3);
    executor.scheduleAtFixedRate(
        new AnimationThread(this), 
        0L, 20L, TimeUnit.MILLISECONDS);
}
}

class AnimationThread implements Runnable   
{
JApplet c;

public AnimationThread(JApplet c)
{

    this.c = c;
}

public void run()
{
    c.repaint();
}
}

class PaintSurface extends JComponent
{
private static final long serialVersionUID = 1L;

public void paint(Graphics g)
{
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(
        RenderingHints.KEY_ANTIALIASING, 
        RenderingHints.VALUE_ANTIALIAS_ON);

    Shape screenDisplay = new Rectangle2D.Float(
            450, 175, 700, 500);

        g2.setColor(Color.DARK_GRAY);
        g2.fill(screenDisplay);

    /*
     * START TITLE SCREEN CREATION
     */

    if(XenixMain.secondsCount > 0)
    {
        g.drawImage(XenixMain.XenixLogo, 500, 500, this);
    }


    g.drawImage(XenixMain.XenixBackground, 0, 0, this);


    /*
     * END TITLE SCREEN CREATION
     */
    }
} 

JFrame Class (Creates JFrame and adds the Applet):

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);
}
}
Fishery answered 1/2, 2014 at 20:11 Comment(8)
It is likely that JApplet is opaque, the other problem is your mixing heavy and light weight components, which presents a z-order issue. A better solution would be to separate the application logic from the container, so that you can simply move it between top level containers...You should also know that applets have a very restrictive privileges, meaning, it's very unlikely that it will have access to the local driveOlly
"..I recently attempted to add a JTextField using absolute positioning (LayoutManger is null) and it works fine, except all the images are removed" You have an odd definition of 'works fine'.Algae
Well I've used absolute positioning before with no problems. Only recently has this happened. Not sure if it is my class setup or what. I don't think it has anything to do with the positioning.Fishery
Tip: 1) Add @Olly (or whoever - the @ is important) to notify them of a new comment. 2) Try testing your 'works fine' null layouts on two or more machines, in 2 or more PLAFs in a resizable GUI. 3) Don't preach to the converted. (Layouts rule). 4) For better help sooner, post a Minimal Complete Tested and Readable Example (MCTRE).Algae
@MadProgrammer, could you edit my code and show me what you mean? I'm having trouble understanding and a visual example would really help.Fishery
Stop using Absolute Positioning, if you really wanted to move inside the world of Swing. If you still so eager to put components at given location have a look at GroupLayout. Moreover, do not override paint instead override paintComponent() Solution to the first problem answers this part :-)Iatrogenic
@nIce cOw, thanks, I tried what you said but it did not work. Maybe I did it wrong? Would you please edit my code. I am a visual learner; Seeing the solution would help...Fishery
@NicholasCreech : Actually the code you using, in it's present form, is not considered a good choice. I might have to change it upside down to atleast make it legit. If you may give me some time, I can give one small example, though for future, never use static thingy so randomly in your View code.Iatrogenic
I
1

Have a look at this example and see if this helps a bit. For some information on the said topic, please see this link. Let me know, if still thingies are unclear.

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);
    }
}
Iatrogenic answered 3/2, 2014 at 2:53 Comment(1)
@NicholasCreech : You are MOST WELCOME and KEEP SMILING :-) Just a point to remember, previously the way the program is accessing the images, if the program is shifted to some other computer, than images will have to be put at the said location as specified on the desktop, though with this example, when you create a jar file, then that thingy won't happen.Iatrogenic

© 2022 - 2024 — McMap. All rights reserved.