Java 背景图像帮助,JPanel,JFrame,什么?
我想为我正在设计的游戏制作一个背景图像,但我无法找到正确的方法来获得我想要的效果,我想要一个可以在文本后面看到的背景。基本上,背景覆盖整个JFrame/JPanel,而不仅仅是布局的一部分(例如BorderLayout.Center)我想它是这样做的,但如果它真的这样做了,我如何使背景透明,让那些人看到后面的背景 我知道,但我希望这里的人能理解我在做什么,并能帮助我。。。这是我当前的代码。我一直在玩弄背景,所以不要读太多我是怎么写的Java 背景图像帮助,JPanel,JFrame,什么?,java,image,swing,background,jlabel,Java,Image,Swing,Background,Jlabel,我想为我正在设计的游戏制作一个背景图像,但我无法找到正确的方法来获得我想要的效果,我想要一个可以在文本后面看到的背景。基本上,背景覆盖整个JFrame/JPanel,而不仅仅是布局的一部分(例如BorderLayout.Center)我想它是这样做的,但如果它真的这样做了,我如何使背景透明,让那些人看到后面的背景 我知道,但我希望这里的人能理解我在做什么,并能帮助我。。。这是我当前的代码。我一直在玩弄背景,所以不要读太多我是怎么写的 import javax.swing.*; import ja
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方法,但我认为你想要一些半透明的东西,你可以用我给你的类实现:)无论哪种方式都有很大帮助。我可以在其他方面使用可调透明度,现在我知道如何:)