覆盖自定义JButton中的paintComponent()方法

时间:2015-05-20 21:51:00

标签: java paintcomponent extending

所以我的最终目标是将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的类,则只显示这个旧按钮。

无论如何,谢谢你们!我希望我能克服这个奇怪的问题。

1 个答案:

答案 0 :(得分:0)

首先,正如其他一些人所说,不要把你的班级命名为“按钮”;它属于Swing的前身AWT(高级窗口工具包),可能最多会混淆编译器,最坏的情况下会给你错误的“按钮”。

这应解决paintComponent()问题,但此外,如果你想要做的就是改变按钮的感觉,那么你就过度编程了。

使用JButton有两种方法可以实现此目的。

第一个,也可能是最简单的(对于图像而言)是AbstractButton.setIcon(Icon defaultIcon)图标是一种图像,可以BufferedImage加载ImageIcon(Image image)并以相同的方式操作。这可能就是你所需要的。

另一种考虑范围更广泛的方法是更改​​应用程序的Look and Feel。我们大多数人都有几个可用于我们的系统,包括默认的Java外观和平台外观。我建议尽早设置它;因为它完全是通过静态方法完成的,对于小项目,你甚至可以在将任何内容初始化之前将其滑入main方法中。

如果这不能解决您的问题,请告诉我,祝您项目的其余部分好运!