如何解决JButton 未出现在其设置位置
我正面临 JButton 无法到达其设定位置的问题........ 我的代码:
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GUI implements ActionListener {
private int clickCount = 0;
private JFrame frame;
private JPanel panel;
private JButton button;
private JLabel label;
private Dimension buttonDim;
public GUI() {
frame = new JFrame();
panel = new JPanel();
button = new JButton("Click me");
label = new JLabel("Number of clicks 0");
button.addActionListener(this);
button.setBorder(null);
button.setLocation(0,0);
panel.setBorder(BorderFactory.createEmptyBorder(300/2,300,300/2,300));
panel.setLayout(new GridLayout(0,1));
panel.add(button);
panel.add(label);
frame.add(panel,BorderLayout.CENTER);
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Our GUI");
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new GUI();
}
@Override
public void actionPerformed(ActionEvent e) {
clickCount++;
label.setText("Number of clicks " + clickCount);
}
}
如果你们真的不介意,你能告诉我我的按钮是如何知道只有 ActionListener
关键字的 this
吗?我一周前开始使用 Java。
解决方法
关于布局
请注意,尽管您可以通过设置组件的位置和大小来手动定位组件,但这样做很少有用。出于以下几个原因,您不会在基于 Web 的 UI、应用程序或 Swing UI 中执行此操作:
- 用户将拥有各种屏幕尺寸和分辨率,因此如果屏幕本身很小,高分辨率屏幕可能需要更大的组件。
- 操作系统具有多种外观(PLAF = 平台外观),并且可能会有很大差异。
- 如今,用户界面经常使用多种语言,而且几乎每种语言都有不同的运行长度。
所有这些原因使创建一个像素完美的布局变得困难,如果不是不可能的话,它可以满足所有需求,而且几乎没有必要。因此,相比之下,每个系统都有自己的方式通过 Swing 使用布局管理器(如 GridLayout
、BorderLayout
等)来布置组件。
在您的情况下,您已将 GridLayout
用于应包含按钮的面板,并且由于您将 rows = 0
和 cols = 1
传递给构造函数,因此您有效地创建了具有任意数量的布局行和一列。如果您现在将按钮添加到面板,GridLayout
管理器将相应地调整按钮的位置。
此外,您的面板有一个边框,它也会影响该面板的内容区域,即内容的位置 0/0。
因此 button.setLocation(0,0);
不会有预期的效果,因为布局管理器会根据可用的内容区域重新定位(并调整大小)按钮。
关于布局管理器的更多提示:
- 您可能希望熟悉各种可用选项。
- 查看
add(Component,...)
的各种版本,这些版本还允许您传递影响布局的“约束”。这些约束的类型取决于您使用的布局管理器。 - 您可以为组件定义首选大小(以及最小/最大)以对布局产生一些影响。许多布局经理会尽量满足您的愿望。
- 如果您真的想自己定位组件,则需要设置
null
布局管理器。但是请注意,您必须自己处理很多事情,而且通常您实际上并不想这样做。通常认为需要使用null
布局来自缺乏内置布局管理器的感觉。在这种情况下,您可能会探索一些 3rd 方布局管理器。我在过去发现特别有用的一个(它甚至带有调试视图)是 MiG layout。
最后一些关于如何设计布局的提示:
在纸上或某些应用中以您的 UI 应具有的最小尺寸绘制预期布局。如果您想调整大小(例如通过增加宽度),请考虑如何使用您获得的额外空间。
还将自己置于用户面临以下场景(可能还有更多)的位置:
- 可用空间比您的 UI 使用的空间多,而且您的 UI 不会将所有可用信息都显示在屏幕上。如果有额外空间,您能否更改布局以提供更多信息?
- 可用空间比您的用户界面所需的空间少。是否仍然可以轻松访问所有相关部分,例如通过滚动?
关于 ActionListeners
您可以为许多组件设置一个动作侦听器,然后在执行某些操作(例如单击按钮)时调用该侦听器。要创建动作侦听器,您需要实现 ActionListener
接口及其 void actionPerformed(ActionEvent)
方法 - 就像您的 GUI
已经在做的那样。
因此,在 button.addActionListener(this);
中,您设置了 GUI
的当前封闭实例,this
将其称为按钮的动作侦听器。
请注意,通常您要么拥有实现 ActionListener
的显式类,要么创建匿名类或 lambda,例如像这样:
//pre-Java 8 way
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("button clicked");
}
});
//using lambdas (ActionListener meets the requirements for functional interfaces)
button.addActionListener(actionEvent -> System.out.println("button clicked") );
致谢:感谢 Andrew Thompson 提供宝贵意见:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。