我无法理解图像在 JPanel 中不显示但在 JFrame 中正常显示的原因
I can't understand the reason why Image is not displaying in JPanel but displaying normally in JFrame
我正在创建一个简单的程序,我想在其中显示一个图像和一个 button.So 我已经创建了一个 JFrame
。
这个 JFrame
包含两个 JPanel
,其中一个面板包含 JButton
,另一个面板包含我的图像。但是图像没有显示在面板中。当我将图像添加到 JFrame
时,它显示正常。请帮助编写以下代码!
main()
方法:
public class NewClass2 {
public static void main(String args[]){
EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frm = new JFrm();
frm.setVisible(true);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setSize(500,500);
}
});
}
}
JFrm
class 初始化 JFrame
:
class JFrm extends JFrame{
JButton button;
JPanel panel0,panel1;
JFrm(){
panel0 = new JPanel();
panel1 = new JPanel();
button = new JButton("Start");
button.setPreferredSize(new Dimension(100, 30));
panel0.add(button);
panel1.add(new ImageComponent()); //adding image component to panel1 is not working
//add(new ImageComponent()); //adding image component to the frame is working ..
add(panel1,BorderLayout.PAGE_START);
add(panel0,BorderLayout.PAGE_END);
}
}
ImageComponent
class 添加图像:
class ImageComponent extends JComponent{
Image img;
ImageComponent(){
img = new ImageIcon("C:\Users\Kaushal28\Desktop\Aqua-Ball-icon.png").getImage();
}
@Override
public void paint(Graphics g){
g.drawImage(img, 100,100 , null);
}
}
如何将图像添加到 JPanel
?
考虑将图像包装在 JLabel 中,然后再将其添加到 JPanel。
参见 Display a jpg image on a JPanel
class JFrm extends JFrame{
JButton button;
JPanel panel0, panel1;
JFrm(){
panel0 = new JPanel();
panel1 = new JPanel();
button = new JButton("Start");
button.setPreferredSize(new Dimension(100, 30));
panel0.add(button);
ImageIcon image = new ImageIcon("C:\Users\Kaushal28\Desktop\Aqua-Ball-icon.png");
panel1.add(new JLabel(image));
add(panel1, BorderLayout.PAGE_START);
add(panel0, BorderLayout.PAGE_END);
}
}
您没有为您的自定义 JComponent
设置大小,因此 LayoutManager 会将其压缩为零大小。使用 setPreferredSize()
设置合适的大小。
ImageComponent(){
ImageIcon temp = new ImageIcon("test.png");
img = temp.getImage();
setPreferredSize(new Dimension(temp.getIconWidth(),temp.getIconHeight()));
}
@Override
public void paint(Graphics g){
g.drawImage(img, 0,0 , null);
}
我正在创建一个简单的程序,我想在其中显示一个图像和一个 button.So 我已经创建了一个 JFrame
。
这个 JFrame
包含两个 JPanel
,其中一个面板包含 JButton
,另一个面板包含我的图像。但是图像没有显示在面板中。当我将图像添加到 JFrame
时,它显示正常。请帮助编写以下代码!
main()
方法:
public class NewClass2 {
public static void main(String args[]){
EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frm = new JFrm();
frm.setVisible(true);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setSize(500,500);
}
});
}
}
JFrm
class 初始化 JFrame
:
class JFrm extends JFrame{
JButton button;
JPanel panel0,panel1;
JFrm(){
panel0 = new JPanel();
panel1 = new JPanel();
button = new JButton("Start");
button.setPreferredSize(new Dimension(100, 30));
panel0.add(button);
panel1.add(new ImageComponent()); //adding image component to panel1 is not working
//add(new ImageComponent()); //adding image component to the frame is working ..
add(panel1,BorderLayout.PAGE_START);
add(panel0,BorderLayout.PAGE_END);
}
}
ImageComponent
class 添加图像:
class ImageComponent extends JComponent{
Image img;
ImageComponent(){
img = new ImageIcon("C:\Users\Kaushal28\Desktop\Aqua-Ball-icon.png").getImage();
}
@Override
public void paint(Graphics g){
g.drawImage(img, 100,100 , null);
}
}
如何将图像添加到 JPanel
?
考虑将图像包装在 JLabel 中,然后再将其添加到 JPanel。 参见 Display a jpg image on a JPanel
class JFrm extends JFrame{
JButton button;
JPanel panel0, panel1;
JFrm(){
panel0 = new JPanel();
panel1 = new JPanel();
button = new JButton("Start");
button.setPreferredSize(new Dimension(100, 30));
panel0.add(button);
ImageIcon image = new ImageIcon("C:\Users\Kaushal28\Desktop\Aqua-Ball-icon.png");
panel1.add(new JLabel(image));
add(panel1, BorderLayout.PAGE_START);
add(panel0, BorderLayout.PAGE_END);
}
}
您没有为您的自定义 JComponent
设置大小,因此 LayoutManager 会将其压缩为零大小。使用 setPreferredSize()
设置合适的大小。
ImageComponent(){
ImageIcon temp = new ImageIcon("test.png");
img = temp.getImage();
setPreferredSize(new Dimension(temp.getIconWidth(),temp.getIconHeight()));
}
@Override
public void paint(Graphics g){
g.drawImage(img, 0,0 , null);
}