java - jframe 的背景 contentPane 会干扰其顶部的 jpanel

标签 java swing background jframe jpanel

我有一个 jframe,上面有一个 jpanel,面板经常必须使用 repaint() 和 revalidate() 更改其内容。我已经成功地将图像、文本和按钮按照我希望的方式放置在该 jpanel 上。一切正常,但现在我尝试为 jframe 设置背景,这不会干扰其上面的内容。例如,如果有一棵树的图画,它应该出现在 jpanel 文本的后面,而不会破坏它。我发现 semi 的工作原理是在 jframe 上使用 setContentPane(),添加一个扩展了 jpanel 并覆盖了 PaintComponent() 的类。所有内容都显示在屏幕上,但文本被垂直挤压,并且元素移向框架顶部。

如果我不使用 setContentPane(),而是将背景类添加到框架中,则无论 jpanel 的 setOpaque() 如何,它都不会出现。 我还尝试使用 jLayeredPane,因为我在互联网上读到的内容表明这是正确的答案。但是,我无法让它工作,并且背景仍然隐藏。

private final int WIDTH = 1024;
private final int HEIGHT = 768;    

Frame()
{
    JFrame frame = new JFrame();
    panel = new JPanel();
    gbc = new GridBagConstraints();

    //Unrelated elements
    //font = new Font(Font.MONOSPACED, Font.PLAIN, 20);
    //border = BorderFactory.createEmptyBorder();
    //imageResizer = new ImageResizer();

    frame.setTitle("Shady Path");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(WIDTH, HEIGHT);
    frame.setLocationRelativeTo(null);
    frame.setResizable(false);
    frame.setIconImage(new ImageIcon("res/human.png").getImage());
    frame.setContentPane(new DrawPanel());

    panel.setLayout(new GridBagLayout());
    panel.setOpaque(false);
    gbc.anchor = GridBagConstraints.PAGE_START;

    frame.add(panel);
    frame.setVisible(true);
 }

 //One of the two methods that change the contents of the jpanel
 void appendMain(String mainImage, JTextArea mainText, JButton button)
 {
    panel.removeAll();

    image = new JLabel(imageResizer.resize(200, 200, mainImage));
    gbc.insets = new Insets(0, 0, 30, 0);
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    panel.add(image, gbc);

    formatText(mainText);
    panel.add(mainText, gbc);

    button.setFont(font);
    button.setForeground(Color.WHITE);
    button.setBackground(Color.BLACK);
    button.setBorder(border);
    gbc.fill = GridBagConstraints.VERTICAL;
    gbc.insets = new Insets(50, 0, 70, 0);
    panel.add(button, gbc);

    panel.revalidate();
    panel.repaint();
 }

 //This is for the text formating
 private void formatText(JTextArea baseText)
 {
    baseText.setEditable(false);
    baseText.setForeground(Color.WHITE);
    baseText.setFont(font);
    baseText.setLineWrap(true);
    baseText.setWrapStyleWord(true);
    baseText.setMargin(new Insets(0, 300, 0, 300));
    baseText.setOpaque(false);

    gbc.insets = new Insets(30, 0, 0, 0);
    gbc.weightx = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
 }

 //The following code is for the paintComponent() class 
 //The imageResizer is another class that I made, but it just resizes images and it is unrelated.
 public class DrawPanel extends JPanel
 {
    private Image image;

 public DrawPanel()
 {
    ImageResizer imageResizer = new ImageResizer();
    ImageIcon imageIcon = imageResizer.resize(1024, 768, "res/test.png");
    image = imageIcon.getImage();
 }

 public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);
 }
 }

最佳答案

嗯...看来@HovercraftFullOfEels 的评论是正确的。从字面上看,我只需将 DrawPanel 的布局设置为 BorderLayout,一切就都解决了。

 public DrawPanel()
 {
    this.setLayout(new BorderLayout());

    ImageResizer imageResizer = new ImageResizer();
    ImageIcon imageIcon = imageResizer.resize(1024, 768, "res/test.png");
    image = imageIcon.getImage();
 }

关于java - jframe 的背景 contentPane 会干扰其顶部的 jpanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54160644/

相关文章:

java - Spring启动错误org.hibernate.MappingException : Could not determine type

java - 选择并执行案例后重复切换案例

java - 按下 JButton 后将 JTable 放置在 JPanel 上

swift - UIImageView 背景图像上的视差 UIScrollview

swift - (Swift) 后台计时器使用什么 API 实现?

java - 如何在静态枚举中获取下一个

java - 您可以在 POJO 类中同时使用 @XmlElement 和 @JsonProperty

Java 组件在启动时不显示

java - JinternalFrame 未显示,也没有任何异常

Java swing - 频繁改变框架的颜色