Java 导入图像会导致渲染问题
Modifiers.javaJava 导入图像会导致渲染问题,java,image,rendering,Java,Image,Rendering,Modifiers.java package game; import java.awt.*; import java.io.*; import javax.swing.*; public class Modifiers extends Data{ public static void setupJcomponents(){ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironmen
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);
}
}
frame.java
package game;
public class Frame {
public static void main(String[] args) {
Modifiers.setupJcomponents();
}
}
每当我尝试在此处引用图像时:
buttonImage[btn]=新的图像图标(Frame.class.getResource(“/game/SelectionButton.png”);
如果它是错误的,那么它只会给我一个NullPointerException,但是如果图像名称是正确的,那么包含所有内容的整个面板就会消失,我使用的所有对象都在单独的Data.java类中正确声明,我知道它的实例化是正确的,但我不知道为什么当线条到达图像位置时,一切都没有呈现出来。所以你的代码提出了很多问题,这一点都不好笑。然而,您的基本问题归结为对基本Swing API的工作原理缺乏了解 秋千很懒。当您从容器中添加/删除组件时,它不会更新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);
问题是,一旦使窗口可见,您就要负责触发布局和绘制过程
您可以通过添加
frame.getContentPane().revalidate();
frame.getContentPane().repaint();
在frame.getContentPane()之后添加(uiPanelMenu)代码>或移动frame.setVisible(true)
afterframe.getContentPane().add(uiPanelMenu)代码>这可能会产生更理想的结果
我知道你认为使用null
布局会让你的生活变得更轻松,但你没有,也没有考虑到文本在不同平台/硬件上呈现方式的所有差异
不使用布局管理API(最终不得不自己复制它的大部分功能)是对自己的极大伤害
相反,花点时间了解更多关于可用布局管理器的信息-新文件(“src/game/PixelFont.ttf”)
是您的第一期,切勿在您的codeuiPanelMenu.setLayout(null)中引用src
代码>我意识到这两个都是不好的形式,我相对较新,所以我肯定会犯错误,但我知道这两个都不是问题,在我添加这一行之前一切正常:buttonImage[btn]=newimageicon(Frame.class.getResource(“/game/SelectionButton.png”)代码>所有内容都在渲染,直到它尝试使用图像为止,但是如果我使用此选项:buttonImage[btn]=newimageicon(Frame.class.getResource(“/game/----png”)代码>其他一切都正常,它只是给了我一个nullpointerexception,所以我知道这一行是问题的根源,我只是不知道如何修复它。没有a我能说的不多,这是可复制的吗?您只需要任何ttf文件作为字体和任何名为SelectionButton的png谢谢,我将尝试找到适合我的项目的布局。
frame.getContentPane().revalidate();
frame.getContentPane().repaint();