Nic
Nic

Reputation: 98

JPanel Inside Of A JPanel

I am trying to get a JPanel to appear inside of another JPanel. Currently, the JPanel is in an external JFrame and loads with my other JFrame. I want the JPanel to be inside the other JPanel so the program does not open two different windows.

Here is a picture:

Picture

The small JPanel with the text logs I want inside of the main game frame. I've tried adding the panel to the panel, panel.add(othePanel). I've tried adding it the JFrame, frame.add(otherPanel). It just overwrites everything else and gives it a black background.

How can I add the panel, resize, and move it?

Edits:

That is where I want the chatbox to be.

That is where I want the chatbox to be.

Class code:

Left out top of class.

public static JPanel panel;
public static JTextArea textArea = new JTextArea(5, 30);
public static JTextField userInputField = new JTextField(30);

public static void write(String message) {
    Chatbox.textArea.append("[Game]: " + message + "\n");
    Chatbox.textArea.setCaretPosition(Chatbox.textArea.getDocument()
            .getLength());
    Chatbox.userInputField.setText("");
}

public Chatbox() {
    panel = new JPanel();
    panel.setPreferredSize(new Dimension(220, 40));
    panel.setBackground(Color.BLACK);

    JScrollPane scrollPane = new JScrollPane(textArea);
    scrollPane.setPreferredSize(new Dimension(380, 100));
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);
    textArea.setEditable(false);
    scrollPane
            .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    userInputField.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            String fromUser = userInputField.getText();
            if (fromUser != null) {
                textArea.append(Frame.username + ":" + fromUser + "\n");
                textArea.setCaretPosition(textArea.getDocument()
                        .getLength());
                userInputField.setText("");
            }
        }
    });
    panel.add(userInputField, SwingConstants.CENTER);
    panel.add(scrollPane, SwingConstants.CENTER);

    //JFrame frame = new JFrame();
    //frame.add(panel);
    //frame.setSize(400, 170);
    //frame.setVisible(true);
}

Main frame class:

    public Frame() {
    frame.getContentPane().remove(loginPanel);
    frame.repaint();

    String capName = capitalizeString(Frame.username);
    name = new JLabel(capName);

    new EnemyHealth("enemyhealth10.png");
    new Health("health10.png");
    new LoadRedCharacter("goingdown.gif");
    new Spellbook();
    new LoadMobs();
    new LoadItems();
    new Background();
    new Inventory();
    new ChatboxInterface();

    frame.setBackground(Color.black);
    Frame.redHealthLabel.setFont(new Font("Serif", Font.PLAIN, 20));
    ticks.setFont(new Font("Serif", Font.PLAIN, 20));
    ticks.setForeground(Color.yellow);
    Frame.redHealthLabel.setForeground(Color.black);

    // Inventory slots
    panel.add(slot1);

    panel.add(name);

    name.setFont(new Font("Serif", Font.PLAIN, 20));
    name.setForeground(Color.white);

    panel.add(enemyHealthLabel);
    panel.add(redHealthLabel);
    panel.add(fireSpellBookLabel);
    panel.add(iceSpellBookLabel);
    panel.add(spiderLabel);
    panel.add(appleLabel);
    panel.add(fireMagicLabel);
    panel.add(swordLabel);

    // Character
    panel.add(redCharacterLabel);

    // Interface
    panel.add(inventoryLabel);
    panel.add(chatboxLabel);

    // Background
    panel.add(backgroundLabel);

    frame.setContentPane(panel);
    frame.getContentPane().invalidate();
    frame.getContentPane().validate();
    frame.getContentPane().repaint();

      //I WOULD LIKE THE LOADING OF THE PANEL SOMEWHERE IN THIS CONSTRUCTOR.

    new ResetEntities();
    frame.repaint();

    panel.setLayout(null);
    Run.loadKeyListener();

    Player.px = Connect.x;
    Player.py = Connect.y;

    new Mouse();

    TextualMenu.rect = new Rectangle(Frame.inventoryLabel.getX() + 80,
            Frame.inventoryLabel.getY() + 100,
            Frame.inventoryLabel.getWidth(),
            Frame.inventoryLabel.getHeight());

    Player.startMessage();
}

Upvotes: 0

Views: 3410

Answers (2)

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285403

For example, using a custom Border:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.RadialGradientPaint;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.AbstractBorder;

@SuppressWarnings("serial")
public class FrameEg extends JPanel {
   public static final String FRAME_URL_PATH = "http://th02.deviantart.net/"
         + "fs70/PRE/i/2010/199/1/0/Just_Frames_5_by_ScrapBee.png";
   public static final int INSET_GAP = 120;

   private BufferedImage frameImg;
   private BufferedImage smlFrameImg;

   public FrameEg() {
      try {
         URL frameUrl = new URL(FRAME_URL_PATH);
         frameImg = ImageIO.read(frameUrl);

         final int smlFrameWidth = frameImg.getWidth() / 2;
         final int smlFrameHeight = frameImg.getHeight() / 2;
         smlFrameImg = new BufferedImage(smlFrameWidth, smlFrameHeight,
               BufferedImage.TYPE_INT_ARGB);
         Graphics g = smlFrameImg.getGraphics();
         g.drawImage(frameImg, 0, 0, smlFrameWidth, smlFrameHeight, null);
         g.dispose();

         int top = INSET_GAP;
         int left = top;
         int bottom = top;
         int right = left;
         Insets insets = new Insets(top, left, bottom, right);
         MyBorder myBorder = new MyBorder(frameImg, insets);

         JTextArea textArea = new JTextArea(50, 60);
         textArea.setWrapStyleWord(true);
         textArea.setLineWrap(true);
         for (int i = 0; i < 300; i++) {
            textArea.append("Hello world! How is it going? ");
         }
         setLayout(new BorderLayout(1, 1));
         setBackground(Color.black);

         Dimension prefSize = new Dimension(frameImg.getWidth(),
               frameImg.getHeight());
         JPanel centerPanel = new MyPanel(prefSize);
         centerPanel.setBorder(myBorder);
         centerPanel.setLayout(new BorderLayout(1, 1));
         centerPanel.add(new JScrollPane(textArea), BorderLayout.CENTER);

         MyPanel rightUpperPanel = new MyPanel(new Dimension(smlFrameWidth,
               smlFrameHeight));
         MyPanel rightLowerPanel = new MyPanel(new Dimension(smlFrameWidth,
               smlFrameHeight));
         top = top / 2;
         left = left / 2;
         bottom = bottom / 2;
         right = right / 2;
         Insets smlInsets = new Insets(top, left, bottom, right);
         rightUpperPanel.setBorder(new MyBorder(smlFrameImg, smlInsets));
         rightUpperPanel.setLayout(new BorderLayout());
         rightLowerPanel.setBorder(new MyBorder(smlFrameImg, smlInsets));
         rightLowerPanel.setBackgroundImg(createBackgroundImg(rightLowerPanel
               .getPreferredSize()));

         JTextArea ruTextArea1 = new JTextArea(textArea.getDocument());
         ruTextArea1.setWrapStyleWord(true);
         ruTextArea1.setLineWrap(true);
         rightUpperPanel.add(new JScrollPane(ruTextArea1), BorderLayout.CENTER);

         JPanel rightPanel = new JPanel(new GridLayout(0, 1, 1, 1));
         rightPanel.add(rightUpperPanel);
         rightPanel.add(rightLowerPanel);
         rightPanel.setOpaque(false);
         add(centerPanel, BorderLayout.CENTER);
         add(rightPanel, BorderLayout.EAST);

      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   private BufferedImage createBackgroundImg(Dimension preferredSize) {
      BufferedImage img = new BufferedImage(preferredSize.width,
            preferredSize.height, BufferedImage.TYPE_INT_ARGB);
      Point2D center = new Point2D.Float(img.getWidth()/2, img.getHeight()/2); 
      float radius = img.getWidth() / 2;
      float[] dist = {0.0f, 1.0f};
      Color centerColor = new Color(100, 100, 50);
      Color outerColor = new Color(25, 25, 0);
      Color[] colors = {centerColor , outerColor };
      RadialGradientPaint paint = new RadialGradientPaint(center, radius, dist, colors);
      Graphics2D g2 = img.createGraphics();
      g2.setPaint(paint);
      g2.fillRect(0, 0, img.getWidth(), img.getHeight());
      g2.dispose();

      return img;
   }

   private static void createAndShowGui() {
      FrameEg mainPanel = new FrameEg();

      JFrame frame = new JFrame("FrameEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.setResizable(false);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class MyPanel extends JPanel {
   private Dimension prefSize;
   private BufferedImage backgroundImg;

   public MyPanel(Dimension prefSize) {
      this.prefSize = prefSize;
   }

   public void setBackgroundImg(BufferedImage background) {
      this.backgroundImg = background;
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (backgroundImg != null) {
         g.drawImage(backgroundImg, 0, 0, this);
      }
   }

   @Override
   public Dimension getPreferredSize() {
      return prefSize;
   }
}

@SuppressWarnings("serial")
class MyBorder extends AbstractBorder {
   private BufferedImage borderImg;
   private Insets insets;

   public MyBorder(BufferedImage borderImg, Insets insets) {
      this.borderImg = borderImg;
      this.insets = insets;
   }

   @Override
   public void paintBorder(Component c, Graphics g, int x, int y, int width,
         int height) {
      g.drawImage(borderImg, 0, 0, c);
   }

   @Override
   public Insets getBorderInsets(Component c) {
      return insets;
   }
}

Which would look like:

enter image description here

Upvotes: 1

camickr
camickr

Reputation: 324118

Don't use static variables.

Don't use a null layout.

Use appropriate layout managers. Maybe the main panel uses a BorderLayout. Then you add your main component to the CENTER and a second panel to the EAST. The second panel can also use a BorderLayout. You can then add the two components to the NORTH, CENTER or SOUTH as you require.

Upvotes: 5

Related Questions