Вопрос

Вот мой 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);
    }
}
Это было полезно?

Решение

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

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

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

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

  3. Тот Самый paint/paintComponent связанные методы вызываются очень часто.Вы не хотите создавать / инициализировать в них объекты.Тот Самый paint/paintComponent методы - это не одноразовый метод, как может показаться.Они постоянно вызываются, и вы должны спроектировать свой графический интерфейс с учетом этого.Разработайте свой 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

        }
    }

}

Другие советы

  1. Don't use a null layout
  2. Don't create components in a painting method. The paint() method is for custom painting only. There is no need for you to override the paint() method.

Read the section from the Swing tutorial How to Use FlowLayout for a simple example that uses buttons and a layout manager.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top