Вы звоните f.setVisible(true)
до того, как вы установили менеджер раскладки, и поэтому графический интерфейс отображается с использованием BorderLayout по умолчанию в JFrame - то есть отображается только последний добавленный компонент.
A плохое решение состоит в том, чтобы сначала установить макет.
A Лучше Решение состоит в том, чтобы изучить, а затем использовать менеджеры компоновки соответствующим образом.
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import javax.swing.*;
@SuppressWarnings("serial")
public class Rough2 extends JPanel {
private static final int P_WIDTH = 600;
private static final int P_HEIGHT = 400;
public Rough2() {
JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 8, 8));
String[] buttonNames = { "Click", "Hello", "Like" };
for (String buttonName : buttonNames) {
JButton button = new JButton(buttonName);
int mnemonic = (int) buttonName.charAt(0);
button.setMnemonic(mnemonic);
button.setFont(button.getFont().deriveFont(Font.BOLD, 24f));
buttonPanel.add(button);
}
setLayout(new GridBagLayout());
add(buttonPanel);
setPreferredSize(new Dimension(P_WIDTH, P_HEIGHT));
}
private static void createAndShowGui() {
Rough2 mainPanel = new Rough2();
JFrame frame = new JFrame("Rough2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}