2013-05-09 166 views
0

我想让JPanel出现在另一个JPanel内部。目前,JPanel在外部JFrame中,并加载了我的其他JFrame。我想让JPanel进入另一个JPanel,所以程序不会打开两个不同的窗口。JPanel内部JPanel

这里有一个画面:

Picture

小的JPanel用文字记录我想主要的游戏框架内。我已经尝试将面板添加到面板,panel.add(othePanel)。我试过把它加入JFrame,frame.add(otherPanel)。它只是覆盖其他所有内容并给它一个黑色的背景。

如何添加面板,调整大小并移动它?

编辑:

这就是我想要的客舱是。

That is where I want the chatbox to be.

类代码:

左明类的顶部。

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); 
} 

主框架类:

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(); 
} 
+0

你的背景框架有三个独立的区域。你究竟在哪里想要你的文本日志出现?您使用哪种布局管理器来处理背景框架? – 2013-05-09 14:53:23

+0

您将需要更多地了解您是如何构建框架的。 – 2013-05-09 15:04:23

+0

我已更新我的主要帖子,提供更多信息。背景框架具有空白布局。 – Nic 2013-05-09 15:12:29

回答

4

不要使用静态变量。

请勿使用空布局。

使用适当的布局管理器。也许主面板使用BorderLayout。然后,将您的主要组件添加到CENTER,并将第二个面板添加到EAST。第二个面板也可以使用BorderLayout。然后,您可以根据需要将这两个组件添加到NORTH,CENTER或SOUTH。

+0

我的框架,主面板和聊天面板都使用空白布局。 – Nic 2013-05-09 15:51:37

+1

我知道。我的建议是正确使用Swing并使用布局管理器。 – camickr 2013-05-09 15:53:15

+0

虽然这是问题。我需要将我的图片放置在特定的位置。不是通用的指南针位置。 – Nic 2013-05-09 15:54:47

1

例如,使用自定义边框:

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; 
    } 
} 

将目光像:

enter image description here

+0

我会试试这个。谢谢。 – Nic 2013-05-10 11:13:19