Итак, моя конечная цель - изменить дизайн JButton от базовой синей кнопки до того, что я хочу, как круг. Так я создаю класс под названием «Button» и сделал это продлить JButtonПереопределение paintComponent() Метод в пользовательском 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 был называться, так что я положил в сообщении отладки , Это сообщение отладки никогда не показывалось. В принципе метод paintComponent() никогда не вызывается, хотя я вручную вызываю метод «repaint» для моего 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 для целей тестирования. Я установил границы кнопки.
Как я уже говорил, кнопка на самом деле появляется на экране. Но сообщение об отладке никогда не отображается. Кроме того, кнопка, отображаемая на экране, выглядит как действительно старые кнопки Windows от 10 лет назад. Все серое с черной рамкой. Эта старая кнопка появляется только в том случае, если я использую класс, который расширяет JButton.
В любом случае, спасибо, ребята! Надеюсь, я смогу преодолеть эту странную проблему.
'Также кнопка, отображаемая на экране, выглядит как действительно старые кнопки Windows от 10 лет назад. Вы уверены, что добавляете, что вы' Button', а не экземпляр java.awt.Button ? – copeg
Вы уверены, что используете подходящий класс Button? Вы назвали свой класс Button, который совпадает с java.awt.Button, который наследует javax.swing.JButton. –
Да, похоже, что вы используете java.awt.Button, попробуйте переименовать свой класс. Вы также должны рассмотреть использование AbstractButton вместо JButton или реализовать свой собственный внешний вид и почувствовать делегат. – MadProgrammer