【问题标题】:JButton not showing properly: EclipseJButton 未正确显示:Eclipse
【发布时间】:2021-02-22 00:59:20
【问题描述】:

Javs Swing Error 您可以在上图中看到代码和输出。我已经将 Eclipse IDE 用于 Java swing。但是按钮没有按预期出现。我是 Java Swing 和 Eclipse 的新手,所以我不知道是否需要任何其他设置。请帮助我并提前致谢。

【问题讨论】:

  • 没有图像!,您必须编写代码而不是使用图像。请解释错误
  • 1.当“按预期”未定义时,很难为您提供帮助。 2.请发布代码而不是它的图像。 3.不要使用空布局。而是使用适当的layout manager
  • 请参阅How do I ask a good question。不要发布代码图片。

标签: java eclipse swing jbutton


【解决方案1】:

您在问题中写道

我是 Java Swing 的新手……

那我推荐你看教程Creating a GUI With JFC/Swing

不要调用方法setBounds() 来放置您的组件——除非您没有使用布局管理器1,但根据您的代码,您正在使用布局管理器,因为您的代码是 打电话给frame.setLayout(null)

JFrame 的 [内容窗格] 的默认布局管理器是 BorderLayout。由于您的代码没有使用add(Component, Object) 方法将JButtonJTextField 添加到JFrame,因此这两个组件都添加到了CENTER 面板,因此一个在另一个之上绘制。 CENTER 面板也使其组件尽可能大。因此JButton 占据了所有JFrame

这是对您的代码的重写,但我真的建议您花时间并努力完成整个教程 - 如果您认真学习 Swing。另请注意,在下面的代码中,我更改了那些不符合Java naming conventions 的名称。我们使用命名约定是为了让我们更容易阅读其他人的代码,也让其他人更容易阅读我们的代码。

以下代码中需要注意的其他事项。

  • ActionListener 实现使用lambda expression
  • 所有 Swing 代码必须在 Event Dispatch Thread (EDT) 上执行。当您创建和显示 JFrame 时,它也会启动 EDT,但是您也可以编写显式启动 EDT 的代码,这就是我在下面代码中的 main() 方法中所做的。
  • 您可以调用setLocation...() 方法之一将JFrame 放置在屏幕的特定部分。如果你不这样做,那么它就会被放置在屏幕的左上角。下面的代码调用setLocationByPlatform(),让主机操作系统决定在屏幕上的哪个位置定位JFrame
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class JavaSwingPractice implements Runnable {

    @Override // java.lang.Runnable
    public void run() {
        createAndShowGui();
    }

    private void createAndShowGui() {
        JFrame frame = new JFrame("Dialog Box!");
        JTextField textF = new JTextField(14);
        JButton button = new JButton("Click!");
        button.addActionListener(e -> textF.setText("Success!"));
        JPanel panel = new JPanel();
        panel.add(button);
        frame.add(textF, BorderLayout.PAGE_START);
        frame.add(panel, BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new JavaSwingPractice());
    }
}

是的,在上面的代码中我没有调用 setDefaultCloseOperation(),因为至少在 JDK 8 中,默认值似乎是 EXIT_ON_CLOSE

1 – 有关布局管理器的说明和详细信息,请参阅 Swing 教程。

【讨论】:

    【解决方案2】:

    问题可能是您的面板的布局管理器,(如果您不使用面板,您应该使用面板直接添加对象而不是框架),如果您使用布局管理器,它如下在面板中定位对象的一些规则。喜欢保持布局管理器为空,虽然 idk y 人不喜欢你说布局管理器为空,但如果你想使用绝对位置,setLayout(null);可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-01
      • 2019-09-28
      • 2013-10-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      相关资源
      最近更新 更多