我想要两个图像从两个不同的类扩展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