【问题标题】:Adding a background image to a panel containing other components [closed]将背景图像添加到包含其他组件的面板 [关闭]
【发布时间】:2011-08-17 11:26:59
【问题描述】:

我在 Java 面板中有一个登录表单,带有用户名/密码字段。

我想在此登录表单下方添加背景图片。

实现这一目标的最佳方法是什么?

提供示例代码的额外奖励,因为我很难弄清楚这一点。

【问题讨论】:

标签: java swing


【解决方案1】:

我脑海中的两个选项:

  1. 重写包含登录表单的面板的paint方法以在绘制子组件之前绘制背景图像。

  2. 执行以下操作

    1. 创建背景图像面板(覆盖paintCompanent 方法以绘制图像)。
    2. 将此面板的布局管理器设置为 BorderLayout
    3. 在包含登录表单的面板上设置opaque(false)
    4. 使用 BorderLayout.CENTER 将登录表单面板添加到背景面板。

第二种方法的演示:

import java.awt.*;
import javax.swing.*;

class BgPanel extends JPanel {
    Image bg = new ImageIcon("water.jpg").getImage();
    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(bg, 0, 0, getWidth(), getHeight(), this);
    }
}

class LoginPanel extends JPanel {
    LoginPanel() {
        setOpaque(false);
        setLayout(new FlowLayout());
        add(new JLabel("username: ")); add(new JTextField(10));
        add(new JLabel("password: ")); add(new JPasswordField(10));
    }
}

public class FrameTestBase extends JFrame {
    public static void main(String args[]) {
        JPanel bgPanel = new BgPanel();
        bgPanel.setLayout(new BorderLayout());
        bgPanel.add(new LoginPanel(), BorderLayout.CENTER);

        FrameTestBase t = new FrameTestBase();
        t.setContentPane(bgPanel);
        t.setDefaultCloseOperation(EXIT_ON_CLOSE);
        t.setSize(250, 100);
        t.setVisible(true);
    }
}

【讨论】:

  • 不错的代码+1,(main方法应该包装在invokeLated中)
  • 嗯.. 我不完全确定它必须是那样的。 实现 UI的是对setVisible(true)的调用。 (IIRC,只有setVisible(true)showpack实现了UI,这意味着在那之前不需要在UI线程上做任何事情)
  • 最后两个代码行 pack(if exist :-) + setVisible(true) 应该在所有情况下都被包装,你建议的另一种方法
  • nulldrawImage 方法中,应该是thisJPanel 是一个ImageObserver)。如果您在截屏之前将 UI 放在白色 BG 上,那么圆角将与 SO 的页面颜色完美匹配。有关制作屏幕截图的更多提示,请参阅How do I create screenshots?
  • 两个优点。实际上,我很惊讶我的屏幕截图程序没有将其保存为透明 gif。 :-)
猜你喜欢
  • 2012-11-27
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 2012-12-06
  • 1970-01-01
  • 2022-07-26
相关资源
最近更新 更多