首页 文章

JPanel里面的JPanel

提问于
浏览
0

我试图让JPanel出现在另一个JPanel中 . 目前,JPanel位于外部JFrame中,并加载了我的其他JFrame . 我希望JPanel位于另一个JPanel中,因此该程序不会打开两个不同的窗口 .

这是一张图片:

Picture

带有我希望在主游戏框架内的文本日志的小JPanel . 我已经尝试将面板添加到面板中, panel.add(othePanel) . 我试过把它添加到JFrame, frame.add(otherPanel) . 它只是覆盖其他所有内容并赋予它黑色背景 .

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

Edits:

这就是我想要聊天室的地方 .

That is where I want the chatbox to be.

Class code:

被排除在课堂之外 .

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

2 回答

  • 4

    不要使用静态变量 .

    不要使用null布局 .

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

  • 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

相关问题