Невидимая кнопка JButton в JPanel

Вот мой JPanel. Первая кнопка видна всегда, но вторая кнопка видна только при наведении на нее курсора. Где может быть проблема?

P.S. Пожалуйста, используйте простой английский, если можете, потому что я плохо говорю по-английски

public class GamePanel extends JPanel implements KeyListener{


GamePanel(){
    setLayout(null);
}

public void paint(Graphics g){

    JButton buttonShip1 = new JButton();
    buttonShip1.setLocation(10, 45);
    buttonShip1.setSize(40, 40);
    buttonShip1.setVisible(true);
    add(buttonShip1);

    JButton buttonShip2 = new JButton();
    buttonShip2.setLocation(110, 145);
    buttonShip2.setSize(440, 440);
    buttonShip2.setVisible(true);
    add(buttonShip2);
    }
}

person dddkk    schedule 11.04.2014    source источник
comment
С кодом много проблем. Для начала, зачем вы добавляете компоненты в метод paint(Graphics)? Вам также следует избегать использования setSize, setLocation и setLayout(null).   -  person Obicere    schedule 12.04.2014
comment
Какого размера кнопка buttonShip2.setSize(440, 440);?   -  person Braj    schedule 12.04.2014


Ответы (2)


Если вы хотите избежать проблем и правильно изучить Java Swing, посмотрите их руководства здесь < / а>.

Здесь слишком много проблем, поэтому я постараюсь не усложнять.

  1. Вы используете макет null. null макетов по большей части избегают, потому что обычно существует макет, который делает именно то, что вы хотите. Требуется некоторое время, чтобы заставить его работать, но есть некоторые значения по умолчанию в этом учебник, которые довольно просты в использовании. Там есть несколько хороших картинок, которые показывают, что вы можете делать с каждым макетом. Если вы используете диспетчер компоновки, вам обычно не нужно использовать setLocation, setSize или setVisible в большинстве компонентов, таких как JButtons.

  2. Вы вызываете метод paint в приложении Swing. Вы хотите вызвать paintComponent, потому что вы используете Swing, а не Awt. Вам также необходимо вызвать метод super.paintComponent(g) в первой строке метода paintComponent, чтобы правильно переопределить другой метод paintComponent.

  3. Методы, связанные с _10 _ / _ 11_, вызываются очень часто. Вы не хотите создавать / инициализировать в них объекты. _12 _ / _ 13_ методы - это не одноразовый метод, как может показаться. Они постоянно вызываются, и вы должны создать свой графический интерфейс с учетом этого. Создавайте свои paint-связанные методы так, чтобы они были событийно-ориентированными, а не последовательными. Другими словами, запрограммируйте метод paintComponent с мыслью, что ваш графический интерфейс пользователя постоянно реагирует на действия, а не работает в последовательном порядке, как обычная программа. Это очень простой подход к нему и, надеюсь, не сбивает с толку вы, но если вы посмотрите этот учебник, то со временем поймете, что я имею в виду.

В Java есть два основных типа графических интерфейсов пользователя. Один Swing, а другой Awt. Ознакомьтесь с этим ответом на stackoverflow, чтобы получить хорошее описание два.

Вот пример того, как выглядят две кнопки на панели JPanel.

public class Test 
{
    public static void main(String[] args) 
    {
        JFrame jframe = new JFrame();
        GamePanel gp = new GamePanel();

        jframe.setContentPane(gp);
        jframe.setVisible(true);
        jframe.setSize(500,500);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }


    public static class GamePanel extends JPanel{

    GamePanel() {
        JButton buttonShip1 = new JButton("Button number 1");
        JButton buttonShip2 = new JButton("Button number 2");
        add(buttonShip1);
        add(buttonShip2);

        //setLayout(null);
        //if you don't use a layout manager and don't set it to null
        //it will automatically set it to a FlowLayout.
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);

        // ... add stuff here later
            // when you've read more about Swing and
            // painting in Swing applications

        }
    }

}
person Matthew    schedule 11.04.2014
comment
Я не говорил об этом, но эти кнопки должны свободно перемещаться при нажатии некоторых клавиш, поэтому могу ли я использовать нулевую раскладку? - person dddkk; 12.04.2014
comment
Я просто привел вам пример рабочего кода для графического интерфейса, чтобы вы начали. Вы можете добавить эту функциональность по своему усмотрению, но я настоятельно рекомендую вам ознакомиться с учебными пособиями, которые я упомянул в сообщении. - person Matthew; 12.04.2014
comment
В любом случае, спасибо за такой исчерпывающий ответ, ваш ответ был полезен - person dddkk; 12.04.2014
comment
Если вы хотите переместить компоненты, вам следует повторно добавить их, изменив их расположение, но не забудьте сделать это в контексте выбранного макета. Как только вы поймете, как Swing работает в Java, вы можете начать использовать более продвинутые методы, например, в учебнике camickr (который на самом деле является другим комментатором!) ComponentMover: tips4java.wordpress.com/2009/06/14/moving-windows - person Matthew; 13.04.2014
comment
Спасибо я проверю - person dddkk; 13.04.2014

  1. Не используйте нулевой макет
  2. Не создавайте компоненты в методе рисования. Метод paint () предназначен только для пользовательской раскраски. Вам не нужно переопределять метод paint ().

Прочтите раздел учебника по Swing Как использовать FlowLayout, чтобы увидеть простой пример использования кнопок. и менеджер по расположению.

person camickr    schedule 11.04.2014