Java 带JFrame的两个按钮(具有固定的宽度/高度和固定的位置)

Java 带JFrame的两个按钮(具有固定的宽度/高度和固定的位置),java,button,jframe,Java,Button,Jframe,我想先说,是的,这是一个家庭作业问题 我们被告知要创建两个按钮来增加各自的计数器。计数器部分在此处未显示的另一个类中完成 首先,我创建了一个新的JFrame和两个带有自己文本的按钮 JFrame frame = new JFrame(); JButton button1 = new JButton("Click me!"); JButton button2 = new JButton("Click me too!"); 我给他们定了界限 button1.setBounds(0, 0, 100,

我想先说,是的,这是一个家庭作业问题

我们被告知要创建两个按钮来增加各自的计数器。计数器部分在此处未显示的另一个类中完成

首先,我创建了一个新的
JFrame
和两个带有自己文本的按钮

JFrame frame = new JFrame();
JButton button1 = new JButton("Click me!");
JButton button2 = new JButton("Click me too!");
我给他们定了界限

button1.setBounds(0, 0, 100, 50);
button2.setBounds(0, 50, 100, 50);
将这些按钮添加到框架上

frame.add(button1);
frame.add(button2);
附加各自的操作侦听器(因为它们各自递增自己的计数器)

设置帧大小和其他设置

frame.setSize(100, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
话虽如此,这就是输出:

如您所见,
button1
位于
button2
后面,尽管有硬编码的
.setBound
属性

我尝试过更改
按钮2.setBounds(..)
的不同设置,但似乎我输入的内容实际上没有改变其位置或大小。但是,将输入更改为
按钮1
,会更改其位置/大小


给出了什么?

您应该避免使用
设置边界(…)
和空布局,因为这会导致非常不灵活的GUI,虽然它们在一个平台上看起来很好,但在大多数其他平台或屏幕分辨率上看起来很糟糕,并且很难更新和维护


相反,如果您希望一个JButton位于另一个JButton之上,并且它们是相等的边,为什么不简单地使用
GridLayout(0,1)

您应该避免使用
setBounds(…)
和空布局,因为这使得GUI非常不灵活,虽然它们在一个平台上看起来不错,但在大多数其他平台或屏幕分辨率上看起来很糟糕,并且很难更新和维护

相反,如果您希望一个JButton位于另一个JButton之上,并且它们是相等的边,为什么不简单地使用
GridLayout(0,1)

JFrame默认使用
BroderLayout
,而
add()
方法默认在中心添加组件。i、 e在同一位置添加两个按钮。使用重载的
add()
方法以及位置,例如:

frame.add(button1,BorderLayout.NORTH);
或者您可以使用
JPanel
。首先在面板上添加按钮,然后在
JFrame
上添加面板

JPanel panel=new JPanel();
panel.add(button1);
panel.add(button2);

frame.add(panel);
您还可以设置按钮的对齐方式

JPanel panel=new JPanel(new FlowLayout(FlowLayout.RIGHT));
或者,您可以定义它们之间的水平/垂直间隙

JPanel panel=new JPanel(new FlowLayout(FlowLayout.RIGHT,10,10));
最后,有关更多信息,请阅读您将在何处找到样本。

JFrame默认使用
BroderLayout
,而
add()
方法默认在中心添加组件。i、 e在同一位置添加两个按钮。使用重载的
add()
方法以及位置,例如:

frame.add(button1,BorderLayout.NORTH);
或者您可以使用
JPanel
。首先在面板上添加按钮,然后在
JFrame
上添加面板

JPanel panel=new JPanel();
panel.add(button1);
panel.add(button2);

frame.add(panel);
您还可以设置按钮的对齐方式

JPanel panel=new JPanel(new FlowLayout(FlowLayout.RIGHT));
或者,您可以定义它们之间的水平/垂直间隙

JPanel panel=new JPanel(new FlowLayout(FlowLayout.RIGHT,10,10));

最后,有关示例的详细信息,请阅读。

JFrame的默认布局管理器是BorderLayout,如果未指定,则默认情况下会将组件添加到BorderLayout.CENTER。由于它们都被添加到中心,一个正在掩盖另一个。您需要为其中一个指定框架上的位置,或者使用其他布局管理器


另外(这与问题无关)您可以对两个按钮使用相同的侦听器,您可以使用if语句检查事件的来源,并基于此进行不同的处理。

JFrame的默认布局管理器是BorderLayout,如果未指定,则默认情况下会将组件添加到BorderLayout.CENTER。由于它们都被添加到中心,一个正在掩盖另一个。您需要为其中一个指定框架上的位置,或者使用其他布局管理器


另外(这与问题无关)您可以对两个按钮使用相同的侦听器,您可以使用if语句来检查事件的来源,并在此基础上对其进行不同的处理。

请参见您有两个按钮,即
按钮1
按钮2
,因此,如果您使用的是setbound属性,则使用“使用绝对定位”将控件以这种方式放置在帧上

JFrame frame = new JFrame();
Container Pane = getContentPane();
Pane.setLayout(null);

JButton button1 = new JButton("Click me!");
JButton button2 = new JButton("Click me too!");

Pane.add(Button1);
Pane.add(Button2);

Insets insets = Pane.getInsets();
Dimension size = Button1.getPreferredSize();
Button1.setBounds(10 + insets.left, 10 + insets.top,size.width, size.height); //use your own constants

size = Button2.getPreferredSize();
Button2.setBounds(75 + insets.left, 5 + insets.top,size.width, size.height + 8);
尽量避免使用它,因为它只会使代码变得冗长,而不是使用java内置布局,如FlowLayout、BorderLayout、GridBagLayout等。请在此处查找更多详细信息


请参见,您有两个按钮,即
按钮1
按钮2
,因此,如果您使用的是setbound属性,则使用“使用绝对定位”将控件以这种方式放置在框架上

JFrame frame = new JFrame();
Container Pane = getContentPane();
Pane.setLayout(null);

JButton button1 = new JButton("Click me!");
JButton button2 = new JButton("Click me too!");

Pane.add(Button1);
Pane.add(Button2);

Insets insets = Pane.getInsets();
Dimension size = Button1.getPreferredSize();
Button1.setBounds(10 + insets.left, 10 + insets.top,size.width, size.height); //use your own constants

size = Button2.getPreferredSize();
Button2.setBounds(75 + insets.left, 5 + insets.top,size.width, size.height + 8);
尽量避免使用它,因为它只会使代码变得冗长,而不是使用java内置布局,如FlowLayout、BorderLayout、GridBagLayout等。请在此处查找更多详细信息


不要使用
setBounds
,像素完美的布局在现代UI设计中是一种错觉,字体、DPI、渲染管道等其他元素不会影响给定组件需要正确渲染的空间大小,相反,请使用适当的布局管理器,像
GridLayout
gridbagloayout
不要使用
setBounds
,像素完美的布局在现代UI设计中是一种错觉,你不需要字体,字体、DPI、渲染管道等其他元素会影响给定组件可能需要正确渲染的空间大小,使用适当的布局管理器,如
GridLayout
gridbagloayout
您的意思是这样的吗?我非常赞成用更现代的、更少的。。硬编码的方式做事情,但不幸的是,这是一个学校的作业,我们得到了模板代码。这是不幸的,但这是所有CS学生经常经历的事情。v@theGreenCabbage:是的,这就是我的建议。你得到的具体限制和模板是什么?好的,我知道了。我只是添加了一个GridLayout构造函数。Tha