2

我想要来自两个不同类的两个图像,它们将 JPanel 扩展为并排。

我遇到的问题是两个 JPanel 应该在 JFrame 内,但是当我执行 framename.add(panel) 时,它会替换另一个而不是并排添加两个 JPanel。

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

所以我的问题是,如果我有两个扩展 Jpanel 的类,我如何在 Jframe 中添加这两个面板,以便它们并排(彼此相邻)而不更换另一个面板?

任何建议将不胜感激。

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

主.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);                          
            }       
    }
4

7 回答 7

2

我想要来自两个不同类的两个图像,它们将 JPanel 扩展为并排。

或者

于 2013-02-28T09:42:48.300 回答
1

JFrame 的默认布局管理器是 BorderLayout。尝试将其更改为使用类似 GridLayout 的东西

查看布局管理器的视觉指南以获得更多想法

于 2013-02-28T09:43:03.587 回答
0

试试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);
于 2013-02-28T09:36:26.520 回答
0

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

还建议创建一个面板作为 contentPaneframe.setContentPane(myPanel); 并使用一些布局(BorderLayout、GridBagLayout 等...)对其进行配置

于 2013-02-28T10:06:22.733 回答
0

在框架集中 FlowLayout()

frame.setLayout(new FlowLayout());

于 2013-02-28T10:12:09.937 回答
0

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

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

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

于 2013-02-28T10:18:51.293 回答
0

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

于 2013-04-24T14:57:16.377 回答