【问题标题】:Basic GUI Swing - components not showing基本 GUI Swing - 组件未显示
【发布时间】:2015-01-30 15:28:19
【问题描述】:

这是我的代码 sn-p 包含子 JButtonJPanel 对象,但它不工作。而且它在 Eclipse 中没有显示任何编译错误。

import java.awt.FlowLayout;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

class gui extends JFrame implements ActionListener {
    private JButton b;
    private TextField c;
    private JLabel l;
    private String sn;

    // Constructor for making framework
    public gui() {  setLayout(new FlowLayout());
    JFrame f=new JFrame("Hello!");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
    f.setSize(200,200);
    f.setTitle("GUI");

    b=new JButton("Click");
    l=new JLabel("Enter Name");
    c=new TextField("Enter..",10);
    c.setEditable(true);
    l.setBounds(20,20,20,20);
    f.setBounds(10, 10, 10, 10);
    b.addActionListener(this);
    add(b);
    add(f);
    add(l);
    add(c);
    } 

    public static void main(String[] args) {
        gui g=new gui();
        g.setVisible(true);
    } //main method

    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Working");
    }
}

【问题讨论】:

  • “不工作”是什么意思? 如何它不起作用?
  • Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上工作。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。

标签: java swing jframe


【解决方案1】:

您的类“是一个”GUI,然后您还创建了一个新的 JFrame,因此您的代码中确实有两个框架。

但是,您使可见的框架没有添加任何组件,因此您看到的只是框架。

然后您尝试将组件添加到您的类中,即框架。但是,您会遇到两个问题:

  1. 你永远不会让这个框架可见并且

  2. Swing 使用布局管理器(您不需要使用 setBounds(...))。默认情况下,它使用 BorderLayout。当您将组件添加到框架而不指定约束时,组件将添加到“中心”。但是,“CENTER”中只能显示一个组件,因此只有最后一个添加的组件是可见的。

您还有其他问题,因为您没有在事件调度线程上创建 GUI。所以确实有太多的问题需要纠正。

我建议您阅读 How to Use BorderLayout 上的 Swing 教程中的部分,以获取有关如何创建简单 GUI 的工作示例。然后修改该代码。

【讨论】:

  • 谢谢你#camcikr!
  • @camcikr 为什么我的 Jlabel 和 Jtextfield 工作只有 jbutton 工作?
  • @M.UsmanSiddiqui,我已经解释过了。阅读我对 BorderLayout 的评论!!!阅读教程以更好地构建代码。从一个工作示例开始!
【解决方案2】:

不需要您的JFrame f=new JFrame("Hello!");
您需要使用this,这已经是您的JFrame,例如:

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setSize(200,200);
this.setTitle("GUI");

同时删除:add(f);f.setBounds(10, 10, 10, 10);

【讨论】:

  • 但是为什么我的 Jlabel 和 Jtextfield 工作只有 jbutton 工作?
  • 别担心,伙计!一旦我的 J 事情全部工作,我就会这样做!请尽快提供任何帮助。
【解决方案3】:

因为您已经扩展了JFrame,所以您不必创建新的JFrame

因为现在你的类本身就是一个 JFrame。这意味着您可以使用 this 代替 f-JFrame 的所有用法:

这样,您的其他组件也将正确添加。因为此刻你将 b、f、i 和 c 添加到右侧的 JFrame 中。

所以用这个:

this.setVisible(true);
this.setSize(200,200);
this.setTitle("GUI");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

甚至更简单:

setVisible(true);
setSize(200,200);
setTitle("GUI");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

【讨论】:

    猜你喜欢
    • 2022-07-12
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多