2015-05-20 3 views
0

Итак, моя конечная цель - изменить дизайн 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.

В любом случае, спасибо, ребята! Надеюсь, я смогу преодолеть эту странную проблему.

+2

'Также кнопка, отображаемая на экране, выглядит как действительно старые кнопки Windows от 10 лет назад. Вы уверены, что добавляете, что вы' Button', а не экземпляр java.awt.Button ? – copeg

+1

Вы уверены, что используете подходящий класс Button? Вы назвали свой класс Button, который совпадает с java.awt.Button, который наследует javax.swing.JButton. –

+0

Да, похоже, что вы используете java.awt.Button, попробуйте переименовать свой класс. Вы также должны рассмотреть использование AbstractButton вместо JButton или реализовать свой собственный внешний вид и почувствовать делегат. – MadProgrammer

ответ

0

Прежде всего, как говорили некоторые другие люди, не называйте свой класс «Button»; который принадлежит предшественнику Swing, AWT (Advanced Windowing Toolkit) и, скорее всего, смущает компилятор в лучшем случае, и в худшем случае вы ошибаетесь.

Это должно решить проблему paintComponent(), но, кроме того, если все, что вы пытаетесь сделать, это изменить ощущение кнопки, то вы перепрограммируете это.

Существует два способа сделать это с помощью JButton.

Первый из них, и, вероятно, самый простой (для изображения), это AbstractButton.setIcon(Icon defaultIcon) Икона представляет собой тип изображения, загружаемый из BufferedImage с ImageIcon(Image image) и манипулируемо таким же образом. Это, вероятно, то, что вам нужно.

Другой метод, который приходит на ум, который гораздо шире по объему, заключается в изменении Look and Feel приложения.У большинства из нас есть несколько доступных для наших систем, включая внешний вид Java по умолчанию и внешний вид платформы. Я рекомендую установить его как можно раньше; так как это полностью делается с помощью статических методов, для небольших проектов вы даже можете уйти, сместив его в основной метод, прежде чем что-нибудь даже инициализируется.

Дайте мне знать, если это не поможет решить вашу проблему, и я желаю вам удачи в остальном проекте!

Смежные вопросы