JButton 显示不正确:Eclipse

JButton not showing properly: Eclipse

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

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

您在问题中写道

I'm new ... to Java Swing

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

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

[内容窗格] JFrame 的默认布局管理器是 BorderLayout. Since your code does not use the 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 教程。