如何在Java中将多个扩展的jpanel添加到一个JFrame中



我想要两个图像从两个不同的类扩展JPanel并排。

我遇到的问题是,两个jpanel应该在JFrame中,但当我执行frame .add(panel)时,它取代了另一个,而不是并排添加两个。

我已经尝试在主类中添加flowlayout和其他布局,但没有图像显示。

所以我的问题是,如果我有两个类扩展Jpanel,我如何在Jframe内添加这两个面板,使它们并排(彼此相邻)而不替换其他面板?

如有任何建议,不胜感激。

编辑:如果我扩展JFrame到一个类,这个类是否自动成为JPanel本身?我知道extends是什么意思,但我不确定它在Jframe中是如何工作的。

Main.java

import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class Main
{       
public static void main(String[] args) 
    {        
        JFrame frame = new JFrame();           
        Panel1 s = new Panel1(); //picture 1
        Panel2 n = new Panel2(); //picture 2
        frame.add(n);
        frame.add(s); //here is the problem, it replaces the previous panel
        f.setSize(200,100);
        f.setLocation(0,400);                    
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Panel1.java

import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class image2 extends JPanel 
    {
        ImageIcon anotherIcon;
        public image2() //constructor
            {                               
                 URL imageURL = Panel1.class.getResource("images/puppy.png");            
                 anotherIcon = new ImageIcon(imageURL);
            }
        public void paint(Graphics g)
            {
                super.paintComponent(g);                
                anotherIcon.paintIcon(this, g, 0, 0);                           
            }       
    }

Panel2.java

import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class Panel2 extends JPanel 
    {
        ImageIcon anotherIcon2;
        public Panel2() //constructor
            {                               
                 URL imageURL = Panel2.class.getResource("images/puppy2.png");           
                 anotherIcon = new ImageIcon(imageURL);
            }
        public void paint(Graphics g)
            {
                super.paintComponent(g);                
                anotherIcon2.paintIcon(this, g, 0, 0);                          
            }       
    }
  • JFrame在API中实现了BorderLayout

  • 只有一个JComponent可以被放在第5位。

我想要两个图像从两个不同的类扩展JPanel肩并肩。

  • 将built_in LayoutManager更改为GridLayout

  • 在没有任何JComponent添加到jpanel的情况下使用JLabel with Icon

JFrame的默认布局管理器是BorderLayout。试着把它改成GridLayout之类的

查看布局管理器视觉指南了解更多信息

试试frame.getContentPane().add(...) ?

并设置内容窗格的布局为FlowLayout(或其他)

JFrame f = new JFrame("This is a test");
f.setSize(400, 150);
Container content = f.getContentPane();
content.setLayout(new FlowLayout()); 
content.add(new JButton("Button 1"));
content.add(new JButton("Button 2"));
f.setVisible(true);

您将面板直接添加到JFrame中,您必须在contentPane中添加面板。

还建议创建一个面板作为contentPane frame.setContentPane(myPanel);并配置一些布局(BorderLayout, GridBagLayout,等等)

In frame set FlowLayout()

框架。setLayout(新FlowLayout ());

我纠正了Panel1.java和Panel2.java的小错误,并添加了如何使用GridBagLayout/GridBagConstraints组合将它们并排放置的示例:

Main.java

import javax.swing.*;
import java.awt.*;
import java.net.URL;
public class Main {
    public static void main(String[] args) {
            GridBagConstraints gbc = new GridBagConstraints();
            JFrame frame = new JFrame();
            frame.setLayout(new GridBagLayout());
            Panel1 s = new Panel1(); //picture 1
            Panel2 n = new Panel2(); //picture 2
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 1;
            gbc.weightx = 1;
            gbc.weighty = 1;
            gbc.fill = GridBagConstraints.BOTH;
            frame.add(n, gbc);
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            frame.add(s, gbc); //here is the problem, it replaces the previous panel
            frame.setSize(200,100);
            frame.setLocation(0,400);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       }
    }

Panel1.java

    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    public class Panel1 extends JPanel {
        ImageIcon anotherIcon;
        public Panel1 ( ) {
            URL imageURL = Panel1.class.getResource("images/puppy.png");
            anotherIcon = new ImageIcon(imageURL);
        }
        public void paint(Graphics g) {
            super.paintComponent(g);
            anotherIcon.paintIcon(this, g, 0, 0);
        }
    }

Panel2.java

    import javax.swing.*;
    import java.awt.*;
    import java.net.URL;
    public class Panel2 extends JPanel {
        ImageIcon anotherIcon;
        public Panel2 ( ) {
            URL imageURL = Panel2.class.getResource("images/puppy2.png");
            anotherIcon = new ImageIcon(imageURL);
        }
        public void paint(Graphics g) {
            super.paintComponent(g);
            anotherIcon.paintIcon(this, g, 0, 0);
        }
    }

您的代码的总体思路并没有错,只是面板被放置在另一个面板的顶部,导致一个隐藏另一个....

你可以试试这个。设置框架布局为: setLayout (null) 然后可以给面板添加边界ie。 setBounds () 然后将这些面板添加到frame

相关内容

  • 没有找到相关文章

最新更新