基本 GUI Swing - 组件未显示
Basic GUI Swing - components not showing
这是我的代码片段,其中包含子 JButton
和 JPanel
对象,但它不起作用。而且它在 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");
}
}
不需要您的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);
您的 class "is a" GUI,然后您还创建了一个新的 JFrame,因此您的代码中确实有两个框架。
但是您设置为可见的框架没有添加任何组件,所以您看到的只是框架。
然后您尝试将组件添加到您的 class 这是一个框架。但是,您会遇到两个问题:
你永远不会让这个框架可见并且
Swing 使用布局管理器(您不需要使用 setBounds(...))。默认情况下,它使用 BorderLayout。当您在未指定约束的情况下将组件添加到框架时,组件将添加到 "CENTER"。但是,"CENTER" 中只能显示一个组件,因此只会显示最后添加的组件。
您还有其他问题,因为您没有在事件调度线程上创建 GUI。所以问题真的太多了,无法改正。
我建议您阅读 Swing 教程中关于 How to Use BorderLayout 的部分,以获取有关如何创建简单 GUI 的工作示例。然后修改那个代码。
因为您已经扩展了 JFrame
,所以您不必创建新的 JFrame
。
因为现在您的 class 本身就是一个 JFrame。这意味着您可以使用 this
代替 f
-JFrame 的每个用法:
这样,您的其他组件也将被正确添加。因为此刻你在右边的JFrame中添加了b,f,i,c。
所以使用这个:
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);
这是我的代码片段,其中包含子 JButton
和 JPanel
对象,但它不起作用。而且它在 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");
}
}
不需要您的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);
您的 class "is a" GUI,然后您还创建了一个新的 JFrame,因此您的代码中确实有两个框架。
但是您设置为可见的框架没有添加任何组件,所以您看到的只是框架。
然后您尝试将组件添加到您的 class 这是一个框架。但是,您会遇到两个问题:
你永远不会让这个框架可见并且
Swing 使用布局管理器(您不需要使用 setBounds(...))。默认情况下,它使用 BorderLayout。当您在未指定约束的情况下将组件添加到框架时,组件将添加到 "CENTER"。但是,"CENTER" 中只能显示一个组件,因此只会显示最后添加的组件。
您还有其他问题,因为您没有在事件调度线程上创建 GUI。所以问题真的太多了,无法改正。
我建议您阅读 Swing 教程中关于 How to Use BorderLayout 的部分,以获取有关如何创建简单 GUI 的工作示例。然后修改那个代码。
因为您已经扩展了 JFrame
,所以您不必创建新的 JFrame
。
因为现在您的 class 本身就是一个 JFrame。这意味着您可以使用 this
代替 f
-JFrame 的每个用法:
这样,您的其他组件也将被正确添加。因为此刻你在右边的JFrame中添加了b,f,i,c。
所以使用这个:
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);