我希望我的按钮与我在 gui 中选择的按钮不在同一行吗?我将如何做?

I want my button not in the same row as my choose buttons in my gui? How will I do that?

如何添加中断以将“制作口袋妖怪”按钮和文本区域与“口袋妖怪选择”不在同一行。我试图放置一个空的 JLabel,但我认为它不起作用。

public class PokemonPanel extends JPanel {

 private JLabel lTitle = new JLabel("Pokemon");
 private JLabel lMsg = new JLabel("                ");
   private JButton bDone = new JButton(" Make Pokemon ");
   private JButton bClear = new JButton(" Clear ");

   private JPanel topSubPanel = new JPanel();
   private JPanel centerSubPanel = new JPanel();
   private JPanel bottomSubPanel = new JPanel();
   private GUIListener listener = new GUIListener();
   private Choice chSpe = new Choice();
   private JLabel lEmp = new JLabel("                ");
   private PokemonGUILizylf st;
   private final int capacity = 10;
   private PokemonGUILizylf[ ] stArr = new     PokemonGUILizylf[capacity];
   private int count = 0;
   private String sOut = new String("");
   private JTextArea textArea = new JTextArea(400, 500);
  private JTextArea textArea2 = new JTextArea(400, 500);


   private JScrollPane scroll = new JScrollPane(textArea,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
   JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);


   public PokemonPanel() {

  this.setLayout(new BorderLayout()); 
  this.setPreferredSize(new Dimension(400, 500));
  topSubPanel.setBackground(Color.cyan); 
  centerSubPanel.setBackground(Color.white); 
  bottomSubPanel.setBackground(Color.white); 
 
  topSubPanel.add(lTitle);
  this.add("North", topSubPanel); 

  JLabel lSpe = new JLabel("Pokemon Available: ");
  JLabel lEmp = new JLabel("         ");
  JLabel lNew = new JLabel("New Pokemon: ");

 //add choices to the choice dropdown list
  chSpe.add("Choose");
  chSpe.add("Bulbasaur");
  chSpe.add("Venusaur");
  chSpe.add("Ivysaur");
  chSpe.add("Squirtle");
  chSpe.add("Wartortle");
  chSpe.add("Blastoise");
  chSpe.add("Charmander");
  chSpe.add("Charmeleon");
  chSpe.add("Charizard");  
 
  centerSubPanel.add(lSpe);
  centerSubPanel.add(chSpe);
  centerSubPanel.add(lEmp);
  centerSubPanel.add(bDone);
  centerSubPanel.add(lNew);
  textArea.setPreferredSize(new Dimension(500, 200));
  textArea.setEditable(false);
  textArea2.setPreferredSize(new Dimension(500, 200));
  textArea2.setEditable(false);
  
  
  textArea.setBackground(Color.white);
  textArea.setEditable(false);
  scroll.setBorder(null);
  centerSubPanel.add(scroll);  //add scrollPane to panel, textArea inside.        
  scroll.getVerticalScrollBar().setPreferredSize(new Dimension(10, 0));
  add("Center", centerSubPanel);
 
  bottomSubPanel.add(lMsg);
 
  bDone.addActionListener(listener); //add listener to button
  bottomSubPanel.add(bClear);
  bClear.addActionListener(listener); //add listener to button 
 //add bottomSubPanel sub-panel to South area of main panel      
  add("South", bottomSubPanel);     

}

这是我的 GUI 的样子: enter image description here

但它应该是这样显示的: enter image description here

有人可以向我解释一下我该怎么做吗?

使用不同的布局管理器(JPanel 使用的默认 FlowLayout 除外)

有关详细信息,请参阅 Laying Out Components Within a Container

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

public class Test {

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

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new PokemonPanel());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PokemonPanel extends JPanel {

        private JLabel lTitle = new JLabel("Pokemon");
//        private JLabel lMsg = new JLabel("                ");
        private JButton bDone = new JButton("Make Pokemon ");
        private JButton bClear = new JButton("Clear");

        private JPanel topSubPanel = new JPanel();
        private JPanel centerSubPanel = new JPanel(new GridBagLayout());
        private JPanel bottomSubPanel = new JPanel();
//        private GUIListener listener = new GUIListener();
        private JComboBox<String> chSpe = new JComboBox<>();
        private JLabel lEmp = new JLabel("                ");
//        private PokemonGUILizylf st;
        private final int capacity = 10;
//        private PokemonGUILizylf[] stArr = new PokemonGUILizylf[capacity];
//        private int count = 0;
//        private String sOut = new String("");
//        private JTextArea textArea = new JTextArea(400, 500);
//        private JTextArea textArea2 = new JTextArea(400, 500);
//
//        private JScrollPane scroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
//                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

        public PokemonPanel() {

            this.setLayout(new BorderLayout());
//            this.setPreferredSize(new Dimension(400, 500));
            topSubPanel.setBackground(Color.cyan);
            centerSubPanel.setBackground(Color.white);
            bottomSubPanel.setBackground(Color.white);

            topSubPanel.add(lTitle);
            this.add("North", topSubPanel);

            JLabel lSpe = new JLabel("Pokemon Available: ");
            JLabel lNew = new JLabel("New Pokemon: ");

            //add choices to the choice dropdown list
            DefaultComboBoxModel<String> chSpeModel= new DefaultComboBoxModel<>();
            chSpeModel.addElement("Choose");
            chSpeModel.addElement("Bulbasaur");
            chSpeModel.addElement("Venusaur");
            chSpeModel.addElement("Ivysaur");
            chSpeModel.addElement("Squirtle");
            chSpeModel.addElement("Wartortle");
            chSpeModel.addElement("Blastoise");
            chSpeModel.addElement("Charmander");
            chSpeModel.addElement("Charmeleon");
            chSpeModel.addElement("Charizard");
            chSpe.setModel(chSpeModel);

            centerSubPanel.setBorder(new EmptyBorder(4, 4, 4, 4));

            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.insets = new Insets(4, 4, 4, 4);
            gbc.anchor = GridBagConstraints.LINE_END;
            centerSubPanel.add(lSpe, gbc);
            
            gbc.gridx++;
            gbc.anchor = GridBagConstraints.CENTER;
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            centerSubPanel.add(chSpe);

            gbc.anchor = GridBagConstraints.NORTH;
            gbc.gridwidth = 1;
            gbc.gridx = 0;
            gbc.gridy++;            
            centerSubPanel.add(bDone, gbc);

            gbc.gridx++;
            gbc.anchor = GridBagConstraints.FIRST_LINE_END;
            centerSubPanel.add(lNew, gbc);

            gbc.gridx++;
            gbc.gridheight = gbc.REMAINDER;
            centerSubPanel.add(new JScrollPane(new JTextArea(10, 10)), gbc);

//            textArea.setEditable(false);
//            textArea2.setEditable(false);
//
//            textArea.setBackground(Color.white);
//            textArea.setEditable(false);
//            scroll.setBorder(null);
//            centerSubPanel.add(scroll);  //add scrollPane to panel, textArea inside.        
//            scroll.getVerticalScrollBar().setPreferredSize(new Dimension(10, 0));
            add("Center", centerSubPanel);

//            bottomSubPanel.add(lMsg);

//            bDone.addActionListener(listener); //add listener to button
            bottomSubPanel.add(bClear);
//            bClear.addActionListener(listener); //add listener to button 
            //add bottomSubPanel sub-panel to South area of main panel      
            add("South", bottomSubPanel);
        }
    }
}

此外,避免使用 setPreferredSize,让布局管理器完成他们的工作。在示例中,我使用 insets(来自 GridBagConstraints)和 EmptyBorder 在组件

周围添加一些额外的 space

此外,请小心使用 AWT 组件(即 Choice),它们并不总是能很好地与 Swing 配合使用。在这种情况下,您应该使用 JComboBox