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

时间:2014-04-13 03:09:03

标签: 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, 50);
button2.setBounds(0, 50, 100, 50);

将这些按钮添加到框架上。

frame.add(button1);
frame.add(button2);

附加他们各自的动作侦听器(因为他们每个都增加自己的计数器)。

ActionListener listener = new ClickListener();
ActionListener listener2 = new ClickListener();
button1.addActionListener(listener);
button2.addActionListener(listener2);

设置帧大小和misc设置。

frame.setSize(100, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

话虽如此,这是输出:

enter image description here

正如您所看到的,button1落后于button2,尽管有.setBound个硬编码属性。

我尝试更改button2.setBounds(..)的不同设置,但似乎没有任何内容实际更改其位置或大小。但是,将输入更改为button1会更改其位置/大小。

是什么给出了?

4 个答案:

答案 0 :(得分:2)

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

相反,如果你想要一个JButton在另一个之上并且它们是相等的边,为什么不简单地使用GridLayout(0, 1)

答案 1 :(得分:1)

frame.add(button1);
frame.add(button2);

JFrame默认为BroderLayout,默认情况下add()方法在CENTER中添加组件。即你在同一个位置添加两个按钮。使用重载的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));

最后了解有关Using Layout Managers的更多信息,您可在其中找到样本。

答案 2 :(得分:1)

看到你有两个按钮,即Button1Button 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等。在这里查看更多细节Layout Types

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

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

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

答案 3 :(得分:0)

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

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