【问题标题】:background image help, JPanel, JFrame, anything?背景图像帮助,JPanel,JFrame,什么?
【发布时间】:2015-01-26 22:24:40
【问题描述】:

我想为我正在设计的游戏制作背景图片,但我想不出正确的方法来获得我想要的效果,我想要一个可以在文本等后面看到的背景。基本上让背景覆盖整个 JFrame / JPanel 不仅仅是布局的一部分(例如 BorderLayout.Center)我认为无论如何它都会这样做,但如果它这样做了,我如何让那些透明的背景看到背后的背景......

我知道令人困惑,但我希望这里有人理解我正在尝试做的事情并可以提供帮助......这是我当前的代码。我一直在玩背景,所以不要过多阅读我的写作方式。

import javax.swing.*;
import javax.swing.border.*;

import java.awt.*;

public class GamePanel extends JPanel {

private JTextPane playertext;
private JTextField wealthstring, currentwealth;

public GamePanel() {

    super();
    setLayout(new BorderLayout());
    setBackground(Game.getBackgroundColor());
    Border raised = BorderFactory.createRaisedBevelBorder();
    Border lowered = BorderFactory.createLoweredBevelBorder();
    setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(4, 4, 4, 4), (BorderFactory.createCompoundBorder(raised, lowered))));
    add(northpanel(), BorderLayout.NORTH);
    add(eastpanel(), BorderLayout.EAST);


}


private JLabel northpanel() {

    Font northfont = new Font("Engravers MT", Font.BOLD, 12);
    ImageIcon banner = new ImageIcon("images/banner.png", "North Background");

    playertext = new JTextPane();
    playertext.setFont(northfont);
    playertext.setEditable(false);
    playertext.setText("Player: \n" + Game.getName());
    playertext.setBackground(Game.getBackgroundColor());
    playertext.setBorder(new EmptyBorder(10,10,10,10));

    wealthstring = new JTextField("Money: ");
    wealthstring.setFont(northfont);
    wealthstring.setEditable(false);
    wealthstring.setHorizontalAlignment(wealthstring.RIGHT);
    wealthstring.setBorder(null);
    wealthstring.setBackground(Game.getBackgroundColor());

    currentwealth = new JTextField();
    currentwealth.setFont(northfont);
    currentwealth.setEditable(false);
    currentwealth.setHorizontalAlignment(wealthstring.RIGHT);
    currentwealth.setBackground(Game.getBackgroundColor());
    currentwealth.setBorder(null);
    String wealthrounded = String.format("%.2f", Game.getMoney());
    currentwealth.setText(wealthrounded);

    JPanel wealthtext = new JPanel();
    wealthtext.setLayout(new GridLayout(2, 1));
    wealthtext.setBackground(Game.getBackgroundColor());
    wealthtext.setBorder(new EmptyBorder(10,10,10,10));
    wealthtext.add(wealthstring);
    wealthtext.add(currentwealth);

    JLabel northpanel = new JLabel();
    northpanel.setLayout(new BorderLayout());
    northpanel.setIcon(banner);
    northpanel.add(new JSeparator(), BorderLayout.PAGE_END);
    northpanel.add(playertext, BorderLayout.WEST);
    northpanel.add(wealthtext, BorderLayout.EAST);
    return northpanel;
}

private JPanel eastpanel() {


    JButton tab1 = new JButton("Tab 1");
    JButton tab2 = new JButton("Tab 2");
    JButton tab3 = new JButton("Tab 3");

    JPanel easttabs = new JPanel();
    easttabs.setLayout(new GridLayout(1, 3));
    easttabs.add(tab1);
    easttabs.add(tab2);
    easttabs.add(tab3);

    JPanel eastpanels = new JPanel();
    eastpanels.setLayout(new BorderLayout());
    eastpanels.setBackground(Game.getBackgroundColor());
    eastpanels.add(easttabs, BorderLayout.NORTH);

    return eastpanels;
}

}

【问题讨论】:

  • 您尝试过使用 JLayeredPane 吗?您还可以覆盖 JPanel 的 paintComponent 方法以显示图像而不是默认背景。
  • JLabels 和其他组件一样,因此您可以将一个作为内容窗格,并在那里布置其他组件。如果这是您想要的,顶部组件可能需要使其背景透明。 (在这种情况下,他们需要遵守不透明合同)。
  • 我没有使用过JLayeredPane,但不会有同样的问题吗?正如我之前所说,我如何将背景设置为透明?

标签: java image swing background jlabel


【解决方案1】:

因此,如果您已经有一个将图像作为背景的 JPanel,并且您想在其上添加另一个面板和您的组件,您可以使用 Opacity 来实现这一点。只有添加到此面板的组件可见。这是代码:

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

public class TransparentPane extends JPanel {

    public TransparentPane() {

        setOpaque(false);

    }

    @Override
    protected void paintComponent(Graphics g) {


        super.paintComponent(g);


        Graphics2D g2d = (Graphics2D) g.create();

        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0f));

        g2d.setColor(getBackground());
        g2d.fill(getBounds());

        g2d.dispose();

    }

}

【讨论】:

  • 谢谢!我知道有一种简单的方法可以做到这一点,而无需创建新类并覆盖超​​级方法。老实说,我在 java api 中寻找“透明度”和“alpha 颜色”,忘记了不透明这个词
  • 希望这会有所帮助,我应该给你 setOpaque 方法,但我认为你想要一些半透明的东西,你可以用我给你的类来实现 :)
  • 无论哪种方式都有很大帮助。现在我知道如何使用可调节透明度来做其他事情了:)
【解决方案2】:

创建一个扩展自 JPanel 的类,并在其paint 方法中在其上绘制图像。 现在创建一个从 JFrame 扩展的类,并在其构造函数中将其内容窗格设置为该 JPanel 类的对象,如下所示。现在您可以向 jframe 添加组件了。

class SimpleTest extends JFrame {

    JButton btn = new JButton("A Game");

    public SimpleTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(new CPane());
        getContentPane().setBackground(Color.red);
        getContentPane().add(btn, BorderLayout.NORTH);
        setSize(new Dimension(300, 300));
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SimpleTest();
            }
        });
    }
}

class CPane extends JPanel {

    Image back;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        try {
            back = ImageIO.read(getClass().getResource("back.jpg"));
        } catch (Exception ex) {
        }
        g.drawImage(back, 0, 0, this);
    }
}

如果你想让 jpanel 透明然后做

panel.setOpaque(false);

【讨论】:

  • 我之前尝试过,但添加 JTextArea 之类的任何操作都完全覆盖了它。
  • 1.将paint更改为paintComponent(在这两种情况下),2.通过pack()缺少初始大小,否则只有工具栏,3.缺少初始线程(更多在Oracle教程中),4.(对于您的答案的潜在支持)覆盖getPreferredSize inside CPane extends JPanel, 5 g.drawImage(back, 0, 0, this);
猜你喜欢
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2012-04-06
  • 2014-01-13
  • 2011-02-08
相关资源
最近更新 更多