所以我的最终目标是将JButton的设计从基本的蓝色按钮改为我想要的任何东西,就像一个圆圈。 所以我创建了一个名为" Button"并使其扩展JButton
public class Button extends JButton {
public Button(String text) {
super(text);
this.setContentAreaFilled(false);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("hello");
//Paint Stuff Will Happen Here
}
@Override
public Dimension getPreferredSize() {
return (new Dimension(120, 120));
}
}
我的第一个目标是确保调用paintComponent方法,因此我输入了一条调试消息。该调试消息从未显示过。 基本上,即使我手动调用"重绘"我的JFrame的方法。 尽管没有调用该方法,但我的JFrame上仍会出现一个常规按钮,这对我来说真的很困惑。
这是我的JPanel代码
public class Scene extends JPanel {
public Scene() {
//Initialize Listeners
Button button = new Button("Hello");
button.setBounds(400, 400, 50, 25);
this.setLayout(null);
this.add(button);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
//Paint Stuff Below
for (int xI = 0; xI < Sprite.allSprites.size(); xI++) {
Sprite sprite = Sprite.allSprites.get(xI);
if (sprite.isVisible) {
g2.drawImage(sprite.image, sprite.rawLocation.x.intValue(), sprite.rawLocation.y.intValue(), null);
}
}
g2.dispose();
}
}
基本上在我的JPanel中我也覆盖了paintComponent方法,以便将我的各种精灵绘制到屏幕上,这种精灵工作得很好,可能与问题无关。
最后,这是我的JFrame代码
public class GameWindow extends JFrame {
private Scene currentScene;
public void initialize(Scene scene) {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(Settings.DEFAULT_WINDOW_SIZE);
this.setResizable(false);
this.setLocation(this.getLocationToCenterScreen());
this.setScene(scene);
}
//Gets the center of the screen with the given window
public Point getLocationToCenterScreen() {
return new Point(Settings.SCREEN_CENTER.x - (this.getSize().width / 2), Settings.SCREEN_CENTER.y - (this.getSize().height / 2));
}
public void setScene(Scene scene) {
this.currentScene = scene;
this.setContentPane(scene);
}
public Scene getCurrentScene() {
return currentScene;
}
}
据我所知,这段代码没什么特别的。 我已设置内容窗格。 我确保每个paintComponent()方法还包含super.paintComponent(g)。 我已将LayoutManager设置为null以进行测试。 我设置了按钮的界限。
正如我所说,按钮实际上显示在屏幕上。但调试消息从未显示。 此外,屏幕上显示的按钮看起来就像10年前的旧Windows按钮。全部为灰色,边框为黑色。 如果我使用扩展JButton的类,则只显示这个旧按钮。
无论如何,谢谢你们!我希望我能克服这个奇怪的问题。
答案 0 :(得分:0)
首先,正如其他一些人所说,不要把你的班级命名为“按钮”;它属于Swing的前身AWT(高级窗口工具包),可能最多会混淆编译器,最坏的情况下会给你错误的“按钮”。
这应解决paintComponent()
问题,但此外,如果你想要做的就是改变按钮的感觉,那么你就过度编程了。
使用JButton
有两种方法可以实现此目的。
第一个,也可能是最简单的(对于图像而言)是AbstractButton.setIcon(Icon defaultIcon)
图标是一种图像,可以BufferedImage
加载ImageIcon(Image image)
并以相同的方式操作。这可能就是你所需要的。
另一种考虑范围更广泛的方法是更改应用程序的Look and Feel。我们大多数人都有几个可用于我们的系统,包括默认的Java外观和平台外观。我建议尽早设置它;因为它完全是通过静态方法完成的,对于小项目,你甚至可以在将任何内容初始化之前将其滑入main方法中。
如果这不能解决您的问题,请告诉我,祝您项目的其余部分好运!