java swing计算器布局

Posted

技术标签:

【中文标题】java swing计算器布局【英文标题】:java swing calculator layouts 【发布时间】:2014-09-14 14:47:56 【问题描述】:

我需要做一个作业并创建一个计算器。这是一门初级 Java 课程,所以请记住,我不是专家。它不应该看起来很壮观,所以实现以下目标的最简单方法会很棒。

它的内部运作很好,但是画它真的很头疼。

到目前为止,我们只接触到了 flowlayout……在这种情况下,这根本不是我想要的。让我先告诉你我在寻找什么布局:

在顶部有一个横跨计算器的标题,可能带有一个 背景填充。 然后在其下方,两个按钮并排。 在其下方,两个标签彼此相邻。 然后是两个相邻的文本字段。 在其下方,两个标签彼此相邻。 然后是两个相邻的文本字段。

我尝试在这里绘制它,但它的格式不正确。如果我可以把它放在 html 中,它基本上就是一个简单的表格,有 6 行和 2 列。但顶行必须跨越两列。

Flowlayout 只需将所有内容从左到右并排放置即可。

之后我尝试使用GridLayout,但顶部标题是这里的问题,因为它没有跨越两列。

到目前为止,这是我的代码:

public class TripCalculator extends JFrame implements ActionListener 

    public static final int WIDTH = 400;
    public static final int HEIGHT = 300;
    public static final int NUMBER_OF_CHAR = 4;
    public JTextField stopTime, distance, tripTime, speed;

    public TripCalculator() 
        setSize(WIDTH, HEIGHT);
        WindowDestroyer listener = new WindowDestroyer();
        addWindowListener(listener);

        Container contentPane = getContentPane();

        contentPane.setLayout(new FlowLayout());

        JLabel heading = new JLabel("HEADING");
        contentPane.add(heading);

        contentPane.setLayout(new FlowLayout());

        JButton addStop = new JButton("BUTTON1");
        addStop.addActionListener(this);

        JButton addLeg = new JButton("BUTTON2");
        addLeg.addActionListener(this);

        contentPane.add(addStop);
        contentPane.add(addLeg);

        JLabel subHead1 = new JLabel("LABEL1");
        contentPane.add(subHead1);

        JLabel subHead2 = new JLabel("LABEL2");
        contentPane.add(subHead2);

        stopTime = new JTextField(NUMBER_OF_CHAR);
        contentPane.add(stopTime);

        distance = new JTextField(NUMBER_OF_CHAR);
        contentPane.add(distance);

        JLabel subHead3 = new JLabel("LABEL3");
        contentPane.add(subHead3);

        JLabel subHead4 = new JLabel("LABEL4");
        contentPane.add(subHead4);

        tripTime = new JTextField(NUMBER_OF_CHAR);
        contentPane.add(tripTime);

        speed = new JTextField(NUMBER_OF_CHAR);
        contentPane.add(speed);
    

如果有人能告诉我正确的方向,我将不胜感激。

【问题讨论】:

我认为这应该可以使用内置的布局管理器,但我发现MigLayout 特别有用,因为它非常灵活和直观,并且还提供了一个调试渲染器来显示计算的布局约束。 FlowLayout 显然不是正确的选择。您应该考虑GridLayoutBoxLayoutGridBagLayout。此外,还有更多由其他人(不是 JDK 的一部分)编写的布局管理器,例如 MigLayout。我担心它会伴随着几个小时的学习。 您可以在 JFrame 中使用 2 JPanels。第一个显示输入/输出,例如FlowLayout,第二个显示按钮使用GridLayout Gridbaglayout 是您所需要的:blue-walrus.com/2011/12/gridbaglayout-tutorial 正如其他人所说,您可以使用这些布局或制作多个面板,每个面板都带有流布局(不是最好的方法,但由于您刚刚学习了该布局,您可以这样做),它是会很痛苦,但这是另一种方法。您可以查看更多关于Layout Managers 的信息,看看哪一个适合您的需求。该链接还提供了示例,或者您可以谷歌它们。 【参考方案1】:

Flowlayout 或 Gridlayout 本身对您没有帮助。您可以使用 Gridbaglayout,也可以使用 FlowLaout+Gridlayout 等布局的组合。

如果你画的是计算器,我假设你画的是这样的:

顶部有标题信息,中间有计算器键盘,底部有一些其他按钮:

这可以通过垂直盒子布局来实现,在顶部和底部使用流式布局,在中间使用带有所有数字键的网格布局。

但是……如果没有你想要表达的图表,很难说出来。

【讨论】:

这确实是我正在寻找的。我不需要底部,基本上只需要顶部的流布局和看起来下方的网格布局。但由于某种原因无法让它工作。感谢您的帮助 @alwynmalan 诀窍应该是使用 3 个面板,Top:FlowLayoutMiddle:GridLayoutcontentPane: 使用 BoxLayout 添加之前创建的(顶部和中间)面板。 @Frakcool 这很有意义......但是我不知道该怎么做,哈哈。将做一些研究并尝试使其发挥作用,谢谢。 让我尝试一些类似于你的计算器的东西,所以我不会为你做作业,而是指导你如何去做【参考方案2】:

这是一个使用多个Layout Managers 的示例,您可以看到您可以使用多个,但您应该使用多个JPanel 来达到您想要的效果。

另外一个建议是:不要从 JFrame 扩展,而是创建一个 JFrame 对象,就像我在此示例中所做的那样 和 here 是您不应该这样做的原因。

import java.awt.*;
import javax.swing.*;
public class LayoutManagersExample 
    public static void main(String args[]) 
        new LayoutManagersExample();
    

    public LayoutManagersExample() 
        JFrame frame = new JFrame("Layout Managers Example");
        JPanel topPane = new JPanel();
        JPanel midPane = new JPanel();
        JPanel panesHolder = new JPanel();
        JLabel label = new JLabel("Top label");
        JTextField field = new JTextField();
        field.setColumns(5);

        topPane.setLayout(new FlowLayout());
        midPane.setLayout(new GridLayout(3, 2));

        topPane.add(label);
        topPane.add(field);

        midPane.add(new JButton("Button 1"));
        midPane.add(new JButton("Button 2"));
        midPane.add(new JButton("Hello I'm a button"));
        midPane.add(new JButton("HEY! Click me :)"));
        midPane.add(new JButton("I love you"));
        midPane.add(new JButton("This is another button"));

        panesHolder.setLayout(new BoxLayout(panesHolder, BoxLayout.Y_AXIS));
        panesHolder.add(topPane);
        panesHolder.add(midPane);

        frame.add(panesHolder);
        frame.setSize(400, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
    

这就是它的样子:

【讨论】:

以上是关于java swing计算器布局的主要内容,如果未能解决你的问题,请参考以下文章

java布局一个计算器

Swing用户界面组件

java-swing编程,实现计算器——支持四则运算

java Swing计算器

教你用java编写计算器

java加法计算器代码