当前位置: 首页 > 知识库问答 >
问题:

设置背景时JFrame位置发生变化

魏凡
2023-03-14
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {

    private Image image = null;

    public ImagePanel(String filename) {
        this.image = new ImageIcon(filename).getImage();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null);
    }
}
public ClientGUI() throws IOException {
        instance = this;

        this.setPreferredSize(new Dimension(400, 400));
        this.setResizable(false);
        this.setTitle("ScanIt");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setLayout(new FlowLayout(FlowLayout.CENTER)); 

        ImagePanel panel = new ImagePanel("C:\\barcode_background.jpg");

        BoxLayout boxLayout = new BoxLayout(panel, BoxLayout.Y_AXIS);

        panel.setLayout(boxLayout);

        panel.add(Box.createVerticalStrut(30));

        JLabel lblLogo = new JLabel("Scan-It");
        lblLogo.setOpaque(true);
        lblLogo.setFont(new Font("Tahoma", Font.BOLD, 48));
        panel.add(lblLogo);

        panel.add(Box.createVerticalStrut(50));

        JLabel lblEnter = new JLabel("הכנס ברקוד");
        lblEnter.setOpaque(true);
        lblEnter.setFont(new Font("Tahoma", Font.BOLD, 24));
        panel.add(lblEnter);

        textField = new JTextField(20);
        panel.add(textField);

        JButton btnSearch = new JButton("חפש מוצר");
        btnSearch.addActionListener(new SearchButtonListener());
        panel.add(btnSearch);

        panel.add(Box.createVerticalStrut(30));

        JButton btnAdmin = new JButton("הוסף מוצר");
        btnAdmin.addActionListener(new AdminButtonListener());
        panel.add(btnAdmin);

        this.add(panel, BorderLayout.CENTER);

        this.pack();
        this.setVisible(true);

    }

由于某些原因,ImagePanel的大小与JFrame的大小不相同(如这里所示:http://prntscr.com/l8d98i)。当我将ImagePanel的大小设置为JFrame的大小时,我的组件都会调整大小。这是为什么?如图所示:http://prntscr.com/l8d9ka

panel.setPreferredSize(this.getPreferredSize());

共有1个答案

洪弘毅
2023-03-14

由于某些原因,ImagePanel的大小与JFrame的大小不相同

那么,您不应该设置框架的大小。

所有Swing组件都负责确定自己的大小。因此,您应该将所有组件添加到框架中,然后使用:

frame.pack();
frame.setVisible( true );
this.setPreferredSize(new Dimension(400, 400));
panel.setPreferredSize(this.getPreferredSize());

实际上,只有JTextField可以调整大小。由于某种奇怪的原因,JTextField的“最大高度”是无限的。对于JLabel和JButton,最大高度是首选高度。

如T67所述,BoxLayout将调整组件的大小,使其达到最大大小。虽然,如果你按照我上面的建议去做,就不用担心这个了。这将是一个问题,只有在未来的应用程序时,帧的大小是可调整的。

我正在使用一个覆盖paintComponent的自定义类来使用ImageIcon

 类似资料:
  • 问题内容: 如何设置JFrame的背景颜色? 问题答案: 检索框架的内容窗格,并使用从继承的方法更改颜色。 例:

  • 问题内容: 有什么方法可以将图像设置为背景JFrame? 问题答案: 没有内置方法,但是有几种方法可以实现。目前我能想到的最直接的方法是: 创建的子类。 重写绘制想要显示的图像的方法。 设置内容窗格的是这个子类。 一些示例代码: 请注意,如果你要使用此代码,则不会处理调整图像大小以适合的大小。

  • 除了背景背景平铺外,CSS还提供了另一个强大的功能,即背景定位技术,能够精确控制背景在对象中的位置。 默认情况下,背景图像都是从元素 padding 区域的左上角开始出现的,但设计师往往希望背景能够出现在任何位置。通过 background-position属性,可以很轻松的控制背景图像在对象的背景区域中的起始显示位置。其语法格式为: background-position: xpos ypos

  • 问题内容: 我学习Java已有几周了,在将背景图像应用于JFrame时,我真的很困惑。我遇到的每个教程都不像我那样创建Frames(我扩展了JFrame),或者如果这样做,说明还不够清楚,我无法理解。 下面的代码来自我自己的项目,因此可以帮助我练习到目前为止所学的内容。请您能否以下面的代码为基础,并向我说明要添加的内容和位置,所以我可能以图像作为框架的背景? 我真正要感谢的一件事是,如果您能解释事

  • 我刚开始尝试创建java接口,我想创建一个作为大学项目的一部分。 就像我说的,我是一个新手,所以我知道它可能非常简单,或者我没有把它搞砸,但如果有人能帮助它,它将会非常接近。

  • 我想为我的jFrame设置一个背景,我正在使用下面的代码: 当我执行它时,在系统输出中我有5个“完成”。所以这意味着所有任务都已执行。我不明白错误在哪里。请帮帮我!