【问题标题】:about layouts in simple calculator关于简单计算器中的布局
【发布时间】:2011-12-11 01:40:34
【问题描述】:

您好,我正在尝试自己制作一个具有编码大小、布局等的计算器(尝试不使用 NetBeans,这不是功课)。但我面临一个关于空白空间的问题。我有一个 TextArea 和 Buttons 但正如您在下面看到的,我无法处理这个空间问题。这是我的代码,

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextArea;

public class calculator extends JFrame {

    public calculator(){

        initComponents();

    }

    private void initComponents(){

        JPanel panelScreen = new JPanel(new GridLayout(0,1));

        JTextArea screen = new JTextArea();
        panelScreen.add(screen);

        JFrame frame = new JFrame("CALCULATOR");
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel panelButtons = new JPanel(new GridLayout(3,3));

        JButton oneButton = new JButton("1");
        panelButtons.add(oneButton);

        JButton twoButton = new JButton("2");
        panelButtons.add(twoButton);

        JButton threeButton = new JButton("3");
        panelButtons.add(threeButton);

        JButton fourButton = new JButton("4");
        panelButtons.add(fourButton);

        JButton fiveButton = new JButton("5");
        panelButtons.add(fiveButton);

        JButton sixButton = new JButton("6");
        panelButtons.add(sixButton);

        JButton sevenButton = new JButton("7");
        panelButtons.add(sevenButton);

        JButton eightButton = new JButton("8");
        panelButtons.add(eightButton);

        JButton nineButton = new JButton("9");
        panelButtons.add(nineButton);

        frame.getContentPane().add(panelScreen, BorderLayout.NORTH);
        //frame.getContentPane().add(new JSeparator(), BorderLayout.CENTER);
        frame.getContentPane().add(panelButtons, BorderLayout.SOUTH);
        frame.setBounds(50, 50, 500, 500);
        frame.setResizable(false);
        //frame.pack();
        frame.setVisible(true);


    }


    public static void main(String[] args) {

        new calculator();

    }

}

这是节目的图片;

如果您能帮助我,我将不胜感激。无论如何谢谢:)

【问题讨论】:

  • 您可以在calculator code 中查看它是如何完成的。它可能不完全适合您的使用,但可能会给您一些想法。
  • 顺便说一句,“0”在哪里?你是那些认为 0 不是数字的人之一吗?我的第二个最小的妹妹就在你身边(概念上)。
  • 哈哈,我只是想处理边框布局.etc,当然我会添加其他东西:D。但感谢提醒:D

标签: java swing layout calculator border


【解决方案1】:

一些建议:

  1. 不要设置 JFrame 的大小,实际上也不要设置任何大小。
  2. 对所有组件调用 pack 以设置它们自己的大小。
  3. 如果您希望按钮更大,请考虑更改其字体大小。

例如,

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

import javax.swing.*;

public class Calc2 {
   public static final String[][] BUTTON_TEXTS = {
      {"7", "8", "9", "+"},
      {"4", "5", "6", "-"},
      {"1", "2", "3", "*"},
      {"0", ".", "/", "="}
   };
   public static final Font BTN_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 24);

   private static void createAndShowGui() {
      JTextField field = new JTextField(10);
      field.setFont(BTN_FONT.deriveFont(Font.PLAIN));
      JPanel btnPanel = new JPanel(new GridLayout(BUTTON_TEXTS.length,
            BUTTON_TEXTS[0].length));

      for (int i = 0; i < BUTTON_TEXTS.length; i++) {
         for (int j = 0; j < BUTTON_TEXTS[i].length; j++) {
            JButton btn = new JButton(BUTTON_TEXTS[i][j]);
            btn.setFont(BTN_FONT);
            btnPanel.add(btn);
         }
      }

      JPanel mainPanel = new JPanel(new BorderLayout());
      mainPanel.add(field, BorderLayout.PAGE_START);
      mainPanel.add(btnPanel, BorderLayout.CENTER);


      JFrame frame = new JFrame("Calc2");
      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(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

【讨论】:

  • 但是如果我不调整 JFrame 的大小,它的大小就会很小。我想要带有文本区域的更大按钮_?
  • 再次,设置字体,但不要设置大小,否则您会看到上面看到的问题,并且在其他操作系统或此操作系统上运行时您将遇到不兼容的 GUI不同的屏幕分辨率。请参阅上面的编辑。
  • @Andrew:请截屏。 :)
【解决方案2】:

import java.awt.*;

import javax.swing.*;
import javax.swing.border.EmptyBorder;

// no need to extend frame!
//public class Calculator extends JFrame {
public class Calculator {

    public Calculator(){    
        initComponents();    
    }

    private void initComponents(){
        // I find it easier to create a panel and SET it as the content pane
        JPanel gui = new JPanel(new BorderLayout(5,5));
        // add some padding to the main GUI
        gui.setBorder(new EmptyBorder(4,4,4,4));

        // not needed if only a single compoinent is to be added!
        //JPanel panelScreen = new JPanel(new GridLayout(0,1));

        // add some constraints to make the output field bigger.
        // if it is intended to be single line, a JTextField should be used.
        JTextArea screen = new JTextArea(2,25);
        gui.add(screen, BorderLayout.NORTH);
        //panelScreen.add(screen);

        JFrame frame = new JFrame("CALCULATOR");
        frame.setContentPane(gui);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // add padding around the buttons
        JPanel panelButtons = new JPanel(new GridLayout(3,3,4,4));

        JButton oneButton = new JButton("1");
        panelButtons.add(oneButton);

        JButton twoButton = new JButton("2");
        panelButtons.add(twoButton);

        JButton threeButton = new JButton("3");
        panelButtons.add(threeButton);

        JButton fourButton = new JButton("4");
        panelButtons.add(fourButton);

        JButton fiveButton = new JButton("5");
        panelButtons.add(fiveButton);

        JButton sixButton = new JButton("6");
        panelButtons.add(sixButton);

        JButton sevenButton = new JButton("7");
        panelButtons.add(sevenButton);

        JButton eightButton = new JButton("8");
        panelButtons.add(eightButton);

        JButton nineButton = new JButton("9");
        panelButtons.add(nineButton);

        //frame.getContentPane().add(new JSeparator(), BorderLayout.CENTER);

        // Add the buttons to the CENTER and they will
        // fill whatever space they are provided.
        gui.add(panelButtons, BorderLayout.CENTER);
        //frame.setBounds(50, 50, 500, 500);
        //frame.setResizable(false);
        frame.pack();
        frame.setVisible(true); 
    }    

    public static void main(String[] args) {    
       java.awt.EventQueue.invokeLater(new Runnable() {

         @Override
         public void run() {
            new Calculator();
         }
       });    
    }    
}

【讨论】:

  • 请注意BorderLayout 是一个layout 用于组件定位 包含在其中的组件,而EmptyBorder 是一个border 包含组件(面板)。这是否为您消除了任何困惑,还是我误解了您的问题?
【解决方案3】:

您可能想研究这个遵循@HFOE 和@mre 建议的example。请注意,代码中没有出现“size”。

【讨论】:

    【解决方案4】:
    1. 阅读Laying Out Components Within a Container
    2. 实施适当的布局

    编辑 -

    快速解决方案 - 将 JFrame 布局管理器替换为 BoxLayout(即 setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)))。

    【讨论】:

    • 其实我刚刚在 5 分钟前完成了该教程:D。然后我开始做这个计算器。
    • @quartaela:这是要走的路,1+
    • 我正在尝试,但我遇到了一些错误。顺便说一句,我将再次阅读 boxlayout 教程。 :) 还是谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 2016-11-10
    • 2012-09-30
    • 2010-12-24
    • 2011-05-16
    • 1970-01-01
    • 2015-05-17
    • 2022-10-24
    相关资源
    最近更新 更多