почему мои кнопки не отображаются?

#java #swing #user-interface

#java #swing #пользовательский интерфейс

Вопрос:

Я пытаюсь создать массив кнопок в качестве имитации диаграммы размещения, но кнопки не отображаются на экране, отображается только рамка. что я делаю не так?

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class guiCreator extends JFrame
{
    public guiCreator()
    {
        setTitle("Seats");
        setSize(500, 600);
        addWindowListener(new WindowAdapter()
             {  public void windowClosing(WindowEvent e)
                {  System.exit(0);
                }
             } );

          Container contentPane = getContentPane();
          contentPane.add(new seatingPanel());
        setVisible(true);  
    }

}

class seatingPanel extends JPanel implements ActionListener
{
    public seatingPanel()
    {
        setLayout(new BorderLayout());

        JPanel panel4seating = new JPanel();//creating a grid panel
        panel4seating.setLayout(new GridLayout(4, 10));//setting the layout of the grid panel

        JButton [] seats = new JButton [40]; //creating a pointer to the buttonsArray
        for (int i = 0; i < 40; i  )
        {
            seats[i] = new JButton();//creating the buttons
            seats[i].addActionListener(this);
            panel4seating.add(seats[i]);
        }
    }

    @Override
    public void actionPerformed(ActionEvent evt) 
    {


    }
    //main
    guiCreator flightSeats = new guiCreator();
  

Ответ №1:

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GuiCreator extends JFrame
{
    public GuiCreator()
    {
        super("Seats");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container contentPane = getContentPane();
        contentPane.add(new SeatingPanel());

        pack();    

        setVisible(true);
    }

    public static void main(String[] args) {
        new GuiCreator();
    }
}

class SeatingPanel extends JPanel
{
    public SeatingPanel()
    {
        super(new BorderLayout());

        JPanel panel4seating = new JPanel();//creating a grid panel
        panel4seating.setLayout(new GridLayout(4, 10));//setting the layout of the grid panel

        JButton [] seats = new JButton [40]; //creating a pointer to the buttonsArray
        for (int i = 0; i < 40; i  )
        {
            seats[i] = new JButton();//creating the buttons
            //better to set the preferred size of the button
            seats[i].setPreferredSize(new Dimension(50,25));
            panel4seating.add(seats[i]);
        }

        add(panel4seating, BorderLayout.CENTER);
    }
}
  
  • Графические интерфейсы должны быть созданы на EDT (моя лень).
  • Используйте верблюжий регистр для имен.
  • В этом случае нет необходимости расширять ни JFrame , ни JPanel .

Другие (недокументированные) изменения в исходном коде являются улучшениями. Если у вас есть вопросы по какой-либо части изменений, задавайте.

Комментарии:

1. большое вам спасибо, это работает? можете ли вы проверить, правильно ли я выполняю прослушиватель действий? я пытаюсь создать таблицу рассадки, и всякий раз, когда нажимается эта кнопка, выполняется действие. Я хочу ссылаться на кнопку, используя ее индекс. и если я добавлю другую JPanel с другим набором кнопок, буду ли я использовать тот же ActionListener

Ответ №2:

Вы создаете new JPanel в seatingPanel конструкторе, но не добавляете его в seatingPanel сам конструктор, поэтому он вообще не будет отображаться.

Попробуйте добавить это в макет seatingPanel.

(Или полностью удалите эту подпанель — установите макет сетки и кнопки непосредственно на свой seatingPanel .)