我必须为学校编写一个Java游戏。我想创建一个框架,在其中我简要地解释了机制。然而,应该这样做的JLabel被绘制了两次。当我关闭框架并再次打开它时,它正确地显示了。我真的不知道这是为什么。
int panelWidth = 16*16*3 + 300 + 3;
int panelHeight = 16*13*3;
JPanel textPanel = new JPanel();
textPanel.setLayout(null);
textPanel.setBounds(0, 0, 2*panelWidth/5, panelHeight);
textPanel.setOpaque(true);
textPanel.setBackground(new Color(0,0,0,0));
JPanel bilderPanel = new JPanel(null){
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
BufferedImage background = null;
BufferedImage image1 = null;
BufferedImage image2 = null;
try {
background = ImageIO.read(getClass().getResource("/Screens/ShovelKnightSplash.png"));
image1 = ImageIO.read(getClass().getResource("/Screens/ShovelKnightSplash.png"));
image2 = ImageIO.read(getClass().getResource("/Screens/ShovelKnightSplash.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int margin = 15;
int withPicture = 3*panelWidth/5 - 2*margin;
int heightPicture = panelHeight /2 - 2*margin;
//g.drawImage(background, -3*panelWidth/5, 0, panelWidth + 300, panelHeight, null);
g.drawImage(image1, margin/2, 0*heightPicture + 1*margin/2, withPicture, heightPicture, null);
g.drawImage(image2, margin/2, 1*heightPicture + 2*margin/2, withPicture, heightPicture, null);
}
};
bilderPanel.setBounds(2*panelWidth/5, 0, 3*panelWidth/5, panelHeight);
bilderPanel.setOpaque(true);
bilderPanel.setBackground(new Color(0,0,0,0));
//bilderPanel.setBackground(Color.blue);
panel.add(textPanel);
panel.add(bilderPanel);
JLabel Uberschrift = new JLabel();
Uberschrift.setText("Das Spiel");
Uberschrift.setBounds(25, 20, 200, 50);
Uberschrift.setFont(new Font("Arial", Font.PLAIN, 25));
JLabel Controls = new JLabel();
Controls.setText("<html><body>"
+ "Controls:<br>"
+ "W,A,S,D -> Bewegen<br>"
+ "Leertaste -> Menü Öffnen<br>"
+ "</body></html>");
Controls.setBounds(25, panelHeight - 250, 2*panelWidth/5 - 50, 150);
Controls.setFont(new Font("Arial", Font.PLAIN, 18));
JLabel text = new JLabel();
text.setText("<html><main>"
+ "Die Geschichte spielt in einer offenen Welt, "
+ "doch neben Ruinen gibt es auch mehrere intakte und bewohnte Städte. Die Welt "
+ "umfasst verschiedene Landschaftstypen wie zum Beispiel weite Wiesen, Wälder, "
+ "Berge und Wüsten."
+ "Von Monstern befallen, ist es die Aufgabe von dir"
+ "und deinem Partner die einzelnen Städte zurückzu erobern"
+ ""
+ ""
+ "Es gibt 5 MiniBosse und einen Endboss, welcher sich in der Mitte der Welt befindet"
+ "Man kann ihn bekämpfen, wann man will. Man ist frei in seinem tun."
+ "Allerdings erleichtert es einem das Spielgeschehen, wenn man sich zuvor mit Items aufrüstet"
+ "und LVL sammelt. Für jeden besiegten MiniBoss wird der Endeboss zunehmend geschwächt."
+ "</main></html>");
text.setBounds(25, 10, 2*panelWidth/5 - 50, 400);
text.setFont(new Font("Arial", Font.PLAIN, 15));
textPanel.add(Uberschrift);
textPanel.add(Controls);
textPanel.add(text);
右边的图片看起来有点奇怪,但那是因为我还没有用实际的图片来替换它们。
我想创建3个JLabel:
- 一个给头条
- 一个用于文本块
- 一个解释控制
因为我希望文本在某些点上断开,所以我使用了HTML代码。这可能是问题所在,但我不确定,也不知道如何开始找到问题。
1条答案
按热度按时间bkhjykvo1#
Swing组件不知道如何处理基于alpha的颜色(即
new Color(0,0,0,0)
),它们要么透明要么不透明。相反,请使用
JComponent#setOpaque
。不要在绘制方法中执行阻塞或长时间运行的操作。绘制应该被优化以尽可能快地运行,否则你的程序可能会React迟钝和/或滞后。
不要使用
null
布局,这些布局只会继续给你带来问题。相反,使用布局管理API。更多细节请参见Laying Out Components Within a Container可运行示例...