微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JButton 未出现在其设置位置

如何解决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 使用布局管理器(如 GridLayoutBorderLayout 等)来布置组件。

在您的情况下,您已将 GridLayout 用于应包含按钮的面板,并且由于您将 rows = 0cols = 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?