【问题标题】:Java GUI Moving buttons to bottom of the pageJava GUI 将按钮移动到页面底部
【发布时间】:2015-01-27 17:04:27
【问题描述】:

我想知道如何将按钮移动到框架/窗口的底部。

我现在拥有的是这样的:

我希望它看起来像这样:

这是我的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Font;

public class checkbook{
   static JButton Button[] = new JButton[8];
   JLabel begin, accountName, balance;
   JFrame frame;
   JPanel jpanel, jpanel1;
   Container contentPane;
   private JTextField textAccount, textBalance;

   public static void main(String[] args){

      checkbook checkbook = new checkbook();
      checkbook.startFrame();
   }

   checkbook(){
      frame = new JFrame("Checkbook");

   }

   public void startFrame(){

      String bottomButtons[] = {
            "Create a New Account", "Load Trans from a file", "Add New Transactions", "Search Transactions",
            "Sort Transactions", "View/Delete Transactions", "Backup Transactions", "Exit"
         };  

      Container contentPane = frame.getContentPane(); 
      contentPane.setLayout(new FlowLayout());
      Font beginFont = new Font("Arial", Font.PLAIN + Font.BOLD, 22);
      textAccount = new JTextField(" ", 15);
      textBalance = new JTextField("0.0", 15);


      begin = new JLabel("Use The Buttons below To Manage Transactions");
      begin.setFont(beginFont);
      contentPane.add(begin);
     //Container contentPane1 = frame.getContentPane();
     //contentPane1.setLayout(new FlowLayout());

      JPanel jpanel = new JPanel();
      accountName = new JLabel ("Account Name: ");
      jpanel.add(accountName);
      jpanel.add(textAccount);

      balance = new JLabel ("Balance: ");
      jpanel.add(balance);
      jpanel.add(textBalance);

      JPanel jpanel1 = new JPanel();
      jpanel1.setLayout(new GridLayout(2,4)); 

      for(int i = 0; i < 8; i++){
         Button[i] = new JButton(bottomButtons[i]);
         jpanel1.add(Button[i]);
         //Button[i].addActionListener(AL);
      }




      frame.pack();
      frame.setSize(800, 300);
      frame.setResizable(false);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true); 
      frame.add(jpanel);
      frame.add(jpanel1);    


   }
}

所以我想知道如何将按钮向下移动到底部。我是否必须使用BorderLayout 并使用BorderLayout.SOUTH 等,或者有没有办法使用我已经拥有的GridLayout 来做到这一点。如果我必须使用BorderLayout,我将如何保持我的按钮井然有序(2 行,4 列)。

【问题讨论】:

  • 您使用的是什么 IDE?为什么不使用拖放功能来更改按钮的位置。
  • @KaranSharma:因为那样你就不会了解布局管理器以及如何使用它们。代码生成应用程序很棒,但除非您非常熟悉底层 GUI 库。
  • 我正在使用 JGrasp,是的,我知道我可以使用 Eclipse 之类的工具来“绘制”我需要的所有内容,但由于这是我正在从事的一个学期项目,所以我宁愿手工编写代码,看看它是如何工作的。基本上就是充满鳗鱼的气垫船所说的。
  • 对不起,如果我错误地插入了我的代码,我不知道如何插入它不必在每行代码前输入 4 个空格。 选择整个代码示例的文本,然后单击消息发布/编辑表单顶部的{} 按钮。

标签: java swing user-interface button layout-manager


【解决方案1】:

我是否必须使用 BorderLayout 并使用 BorderLayout.SOUTH

是的,但最好的答案是让您尝试一下,看看会发生什么。你为什么不呢?

如果我必须使用 BorderLayout,我将如何保持按钮井然有序(2 行,4 列)。

嵌套 JPanel。使用 JPanel 将按钮放在 GridLayout 中,然后放置 JPanel BorderLayout.SOUTH,或者更好的是 BorderLayout.PAGE_END

例如,

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;

import javax.swing.*;

@SuppressWarnings("serial")
public class NestedPanels extends JPanel {
   private static final String TITLE_TEXT = "Use The Buttons Below To Manage Transactions";
   private static final String[] BTN_TEXTS = { "Create a New Account",
         "Load a Trans from a File", "Add New Transactions",
         "Search Transactions", "Sort Transactions",
         "View/Delete Transactions", "Backup Transaction", "Exit" };
   private static final int TITLE_POINTS = 24;

   public NestedPanels() {
      JLabel titleLabel = new JLabel(TITLE_TEXT, SwingConstants.CENTER);
      titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD,
            TITLE_POINTS));
      JPanel titlePanel = new JPanel();
      titlePanel.add(titleLabel); // put it in a JPanel so it will expand to fill BoxLayout

      JPanel accountBalancePanel = new JPanel();
      accountBalancePanel.add(new JLabel("Account Name:"));
      accountBalancePanel.add(new JTextField(10));
      accountBalancePanel.add(Box.createHorizontalStrut(20));
      accountBalancePanel.add(new JLabel("Balance:"));
      accountBalancePanel.add(new JTextField(10));

      JPanel northPanel = new JPanel();
      northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.PAGE_AXIS));
      northPanel.add(titlePanel);
      northPanel.add(accountBalancePanel);

      JPanel southBtnPanel = new JPanel(new GridLayout(2, 4, 1, 1));
      for (String btnText : BTN_TEXTS) {
         southBtnPanel.add(new JButton(btnText));
      }

      setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
      setLayout(new BorderLayout());
      add(northPanel, BorderLayout.NORTH);
      add(Box.createRigidArea(new Dimension(400, 400))); // just an empty placeholder
      add(southBtnPanel, BorderLayout.SOUTH);
   }

   private static void createAndShowGui() {
      NestedPanels mainPanel = new NestedPanels();

      JFrame frame = new JFrame("Nested Panels Example");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

显示为:

【讨论】:

  • 啊谢谢,我试试看!
  • 所以澄清一下,我将不得不为我的网格布局制作一个 JPanel,然后再制作一个 JPanel 将带有 GridLayout 的 JPanel 放在底部。
  • 目前,我无法弄清楚如何嵌套 Jpanels,这似乎很容易,但由于某种原因,我无法理解这个概念。你能给我举个例子吗?
  • @AlternateRealm:例如
猜你喜欢
  • 2010-09-23
  • 2017-05-23
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多