gpt4 book ai didi

java - Java Swing 组件 onUpdate 渲染错误

转载 作者:行者123 更新时间:2023-12-02 04:09:15 25 4
gpt4 key购买 nike

我在 Java 中遇到 JLabel 渲染问题:我使用可观察的模式观察者,当我的模型通知我的 View JLabel 已更改 JLabel 的内容时,或者特别是在我的 JLabel 区域中显示的内容是随机的。有时它会渲染另一个面板中按钮的一部分,或者有时它会渲染我在 View 的其他组件中设置的颜色!但如果我最小化然后最大化我的框架,所有内容都会正确渲染。

抱歉我的英语不好。

这是右侧和左侧数字的正确呈现 enter image description here

这是当我单击某个按钮然后执行一些 OnUpdate() 时的渲染 enter image description here

编辑这是我的 JPanel 类,其中包含 JLabels:

class InformationPanel extends JPanel {

private static final int DEFAULT_INFO_WIDTH = Configuration.DEFAULT_INFO_PANEL_WIDTH;
private static final int DEFAULT_INFO_HEIGHT = Configuration.DEFAULT_INFO_PANEL_HEIGHT;

private String playerId;
private int numNaviVive;
private int numNaviAffondate;
private JLabel JLabelNumNaviAffondate;
private JLabel JLabelNumNaviVive;

public InformationPanel(String playerId) {
this.playerId = playerId;
numNaviVive = 0;
numNaviAffondate = 0;

JButton JButtonPlayerId = new JButton(playerId);
JLabelNumNaviAffondate = new JLabel(String.valueOf(numNaviAffondate));
JLabelNumNaviVive = new JLabel(String.valueOf(numNaviVive));
JLabel JlblNumNaviVive = new JLabel("Navi disponibili:");
JLabel JlblNumNaviAffondate = new JLabel("Navi affondate: ");

JButtonPlayerId.setBackground(new Color(0, 0, 0, 0));
JButtonPlayerId.setFont(new Font("Serif", Font.BOLD, 16));
JButtonPlayerId.setForeground(Color.YELLOW);
JButtonPlayerId.setFocusable(false);
JButtonPlayerId.setEnabled(false);

JlblNumNaviVive.setBackground(new Color(0, 0, 0, 0));
JlblNumNaviVive.setFont(new Font("Serif", Font.BOLD, 16));
JlblNumNaviVive.setForeground(Color.YELLOW);
JlblNumNaviVive.setDoubleBuffered(true);

JlblNumNaviAffondate.setBackground(new Color(0, 0, 0, 0));
JlblNumNaviAffondate.setFont(new Font("Serif", Font.BOLD, 16));
JlblNumNaviAffondate.setForeground(Color.YELLOW);
JlblNumNaviAffondate.setDoubleBuffered(true);

JLabelNumNaviAffondate.setBackground(new Color(0, 0, 0, 0));
JLabelNumNaviAffondate.setFont(new Font("Serif", Font.BOLD, 16));
JLabelNumNaviAffondate.setForeground(Color.YELLOW);
JLabelNumNaviAffondate.setFocusable(false);
JLabelNumNaviAffondate.setEnabled(false);

JLabelNumNaviVive.setBackground(new Color(0, 0, 0, 0));
JLabelNumNaviVive.setFont(new Font("Serif", Font.BOLD, 16));
JLabelNumNaviVive.setForeground(Color.YELLOW);
JLabelNumNaviVive.setFocusable(false);
JLabelNumNaviVive.setEnabled(false);

setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
setPreferredSize(new Dimension(DEFAULT_INFO_WIDTH, DEFAULT_INFO_HEIGHT));
//setBackground(new Color(0, 0, 0, 0));
setBackground(new Color(0,0,0,40));

add(JButtonPlayerId);
add(JlblNumNaviAffondate);
add(JLabelNumNaviAffondate);
add(JlblNumNaviVive);
add(JLabelNumNaviVive);
setVisible(true);
}

public String getId() {
return playerId;
}

public int getNumNaviAffondate() {
return numNaviAffondate;
}

public int getNumNaviVive() {
return numNaviVive;
}

public void setNumNaviVive(int numNaviVive) {
this.numNaviVive = numNaviVive;
this.JLabelNumNaviVive.setText(String.valueOf(numNaviVive));
this.validate();

}

public void setNumNaviAffondate(int numNaviAffondate) {
this.numNaviAffondate = numNaviAffondate;
this.JLabelNumNaviAffondate.setText(String.valueOf(numNaviAffondate));
this.validate();
}
}

最佳答案

所有变量名称首先不应以大写字符开头。您的代码很难阅读,因为论坛认为您的所有变量都是类名并突出显示它们。遵循 Java 约定,不要创建自己的约定。

JLabelNumNaviAffondate.setBackground(new Color(0, 0, 0, 0));

变量默认是透明的,因此您无法为其设置背景颜色。您尝试设置透明颜色的事实可能是也可能不是您的问题。

setBackground(new Color(0,0,0,40));

这可能就是问题所在。您不能只在 Swing 组件上设置透明度,因为这会破坏绘画链。这是一个不透明组件保证绘制其自身的背景,但是当您使用透明度时,背景不会完全绘制,因此您会得到绘制伪影。

所以基本上你需要自己管理背景的绘制。所以你实际上需要让你的组件对父组件不透明,首先绘制,然后你可以绘制透明背景。

JPanel panel = new JPanel()
{
protected void paintComponent(Graphics g)
{
g.setColor( getBackground() );
g.fillRect(0, 0, getWidth(), getHeight());
super.paintComponent(g);
}
};
panel.setOpaque(false);
panel.setBackground( new Color(255, 0, 0, 20) );
frame.add(panel);

参见Background With Transparency获取更多信息和更简单的解决方案,这样您就不需要在所有组件上进行自定义绘制。

关于java - Java Swing 组件 onUpdate 渲染错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com