Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 背景图像帮助,JPanel,JFrame,什么?_Java_Image_Swing_Background_Jlabel - Fatal编程技术网

Java 背景图像帮助,JPanel,JFrame,什么?

Java 背景图像帮助,JPanel,JFrame,什么?,java,image,swing,background,jlabel,Java,Image,Swing,Background,Jlabel,我想为我正在设计的游戏制作一个背景图像,但我无法找到正确的方法来获得我想要的效果,我想要一个可以在文本后面看到的背景。基本上,背景覆盖整个JFrame/JPanel,而不仅仅是布局的一部分(例如BorderLayout.Center)我想它是这样做的,但如果它真的这样做了,我如何使背景透明,让那些人看到后面的背景 我知道,但我希望这里的人能理解我在做什么,并能帮助我。。。这是我当前的代码。我一直在玩弄背景,所以不要读太多我是怎么写的 import javax.swing.*; import ja

我想为我正在设计的游戏制作一个背景图像,但我无法找到正确的方法来获得我想要的效果,我想要一个可以在文本后面看到的背景。基本上,背景覆盖整个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;
}

}

创建一个从JPanel扩展而来的类,并在其paint方法中在其上绘制图像。 现在创建一个从JFrame扩展的类,并在其构造函数中将其contentpane设置为该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);

所以,如果你已经有了一个以你的图像为背景的JPanel,并且你想在它上面添加另一个面板和你的组件,你可以使用不透明度来实现这一点。只有添加到此面板的组件才可见。代码如下:

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();

    }

}

您是否尝试使用JLayeredPane?您还可以覆盖JPanel的paintComponent方法,以显示图像而不是默认背景。
JLabels
与其他组件一样,因此您可以将其中一个组件设置为内容窗格,并在其中布置其他组件。如果您需要的话,顶部组件的背景可能需要透明。(在这种情况下,他们还需要遵守不透明合同)。我没有使用JLayeredPane,但这不会有同样的问题吗?正如我之前所说的,如何将背景设置为透明?我以前尝试过,但添加JTextArea之类的任何东西都会完全覆盖它。1。将“绘制”更改为“绘制组件”(在这两种情况下),2。缺少按pack()进行的初始大小调整,否则只有工具栏3。缺少初始线程(在Oracle教程中有详细介绍),4。(对于您答案的潜在投票)覆盖CPane extends JPanel内的getPreferredSize
,5 g.drawImage(返回,0,0,此);非常感谢。我知道有一种简单的方法可以做到这一点,而不必创建新类和重写超级方法。老实说,我在java api中查找“透明度”和“alpha颜色”,完全忘记了opaqueHope这个词。希望这有帮助,我应该给你setOpaque方法,但我认为你想要一些半透明的东西,你可以用我给你的类实现:)无论哪种方式都有很大帮助。我可以在其他方面使用可调透明度,现在我知道如何:)