gpt4 book ai didi

java - 导入图像导致渲染问题

转载 作者:行者123 更新时间:2023-12-01 19:39:07 25 4
gpt4 key购买 nike

修饰符.java

package game;
import java.awt.*;
import java.io.*;
import javax.swing.*;

public class Modifiers extends Data{
public static void setupJcomponents(){

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try{
PixelFont = Font.createFont(Font.TRUETYPE_FONT, new File("src/game/PixelFont.ttf"));
ge.registerFont(PixelFont);
} catch (IOException | FontFormatException e) {
PixelFont = new Font("OCR A Extended", Font.PLAIN, heightUnits*2);
ge.registerFont(PixelFont);
}

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setUndecorated(true);
frame.setSize(MW,MH);
frame.setResizable(false);
frame.setVisible(true);
frame.setLayout(null);

uiPanelMenu.setLayout(null);
uiPanelMenu.setVisible(true);
uiPanelMenu.setBounds(0,0,MW,MH);
uiPanelMenu.setOpaque(false);
for(int btn=0; btn<4; btn++) {
try {
buttonImage[btn] = new ImageIcon(Frame.class.getResource("/game/SelectionButton.png"));
} catch (Exception e) {
e.printStackTrace();
}
buttons[btn] = new JPanel();
buttonLabel[btn] = new JLabel("",SwingConstants.CENTER);
buttonLabel[btn].setIcon(buttonImage[btn]);
buttons[btn].setBounds(widthUnits*15,(heightUnits*13)+(heightUnits*3*btn),widthUnits*15,heightUnits*3);
buttonLabel[btn].setBounds(0,0,buttons[btn].getWidth(),buttons[btn].getHeight());
buttons[btn].setLayout(null);
uiPanelMenu.add(buttons[btn]);
buttons[btn].add(buttonLabel[btn]);
buttonLabel[btn].setForeground(Color.black);
buttons[btn].setBackground(Color.white);
buttonLabel[btn].setText("Button "+(btn+1));
buttonLabel[btn].setFont(new Font("PixelFont", Font.PLAIN, heightUnits*2));
buttons[btn].setVisible(true);
buttonLabel[btn].setVisible(true);
}


menuBackground.setBounds(0,0,MW,MH);
menuBackground.setBackground(Color.black);
menuBackground.setVisible(true);
uiPanelMenu.add(menuBackground);

healthIndicator.setText(String.valueOf(healthValue));
healthIndicator.setFont(new Font("PixelFont", Font.PLAIN, heightUnits*2));
healthIndicator.setBounds(widthUnits*20,heightUnits*20,widthUnits*5,heightUnits*2);
healthIndicator.setVisible(true);
healthIndicator.setOpaque(false);
healthIndicator.setForeground(Color.blue);
uiPanelFight.add(healthIndicator);

frame.getContentPane().add(uiPanelMenu);
}
}

数据.java

package game;

import java.awt.*;

import javax.swing.*;

public class Data {

// this is where I will declare and alter all variable that will be used
public static JFrame frame = new JFrame();
public static JLabel healthIndicator = new JLabel("",SwingConstants.CENTER);
public static JPanel buttons[] = new JPanel[5];
public static JLabel buttonLabel[] = new JLabel[5];
public static JPanel menuBackground = new JPanel();
public static JPanel title = new JPanel();
public static JPanel uiPanelMenu = new JPanel();
public static JPanel uiPanelFight = new JPanel();
public static ImageIcon buttonImage[] = new ImageIcon[5];

public static final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
public static final int MW = (int) screenSize.getWidth();
public static final int MH = (int) screenSize.getHeight();
public static final int widthUnits = MW/45;
public static final int heightUnits = MH/25;

public static Font PixelFont;

public static int maxHealth = 100;
public static int healthValue = maxHealth;

}

框架.java

package game;

public class Frame {

public static void main(String[] args) {
Modifiers.setupJcomponents();
}

}

每当我尝试在此处引用图像时:ButtonImage[btn] = new ImageIcon(Frame.class.getResource("/game/SelectionButton.png"));如果它是错误的,那么它只会给我一个 NullPointerException,但如果图像名称正确,那么包含所有内容的整个面板就会消失,我使用的所有对象都在单独的 Data.java 类中正确声明,我知道它是正确实例化,但我不知道为什么当线条到达图像位置时,所有内容都没有呈现。

最佳答案

所以你的代码引发了很多问题,这并不好笑。但是,您的基本问题归结为缺乏对基本 Swing API 工作原理的理解。

Swing 很懒。当您从容器中添加/删除组件时,它不会更新 UI,这取决于您。

所以,您的基本代码目前看起来像......

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
//frame.setUndecorated(true);
frame.setSize(MW, MH);
//frame.setResizable(false);
frame.setVisible(true);
// ?? Why ?? Besides, it's not doing what you think it is
frame.setLayout(null);

// Add all the stuff to uiPanelMenu ...

frame.getContentPane().add(uiPanelMenu);

问题是,一旦您使窗口可见,您就负责触发布局和绘制 channel 。

您可以通过添加来解决基本问题

frame.getContentPane().revalidate();
frame.getContentPane().repaint();

frame.getContentPane().add(uiPanelMenu); 之后 或在 frame.getContentPane().add( 之后移动 frame.setVisible(true); uiPanelMenu); 这可能会产生更理想的结果。

我知道您认为使用 null 布局可以让您的生活更轻松,但事实并非如此,您也没有考虑到文本在不同平台/硬件上呈现方式的所有差异。

如果不使用布局管理 API,您就会给自己带来巨大的伤害(最终将不得不自己复制其大部分功能)。

相反,请花时间了解有关可用布局管理器的更多信息 - Laying Out Components Within a Container

关于java - 导入图像导致渲染问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59186248/

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