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
显然不是正确的选择。您应该考虑GridLayout
、BoxLayout
或GridBagLayout
。此外,还有更多由其他人(不是 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: 与FlowLayout
和 Middle: 与 GridLayout
。 contentPane: 使用 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计算器布局的主要内容,如果未能解决你的问题,请参考以下文章