Reputation: 79
Here is my code snippet containing child JButton
and JPanel
objects but it's not working. And it's not showing any compilation errors in 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");
}
}
Upvotes: 0
Views: 116
Reputation: 22343
Because you already extend JFrame
, you don't have to create a new JFrame
.
Because now your class is a JFrame itself. That means that you can replace every usage of your f
-JFrame by using this
instead:
That way, also your other Components will be added correctly. Because at the moment you add b, f, i and c to the right JFrame.
So use this:
this.setVisible(true);
this.setSize(200,200);
this.setTitle("GUI");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
or even more simple:
setVisible(true);
setSize(200,200);
setTitle("GUI");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Upvotes: 0
Reputation: 5048
Your JFrame f=new JFrame("Hello!");
is not needed.
You need to use this
which is already your JFrame
like:
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setSize(200,200);
this.setTitle("GUI");
Also remove: add(f);
and f.setBounds(10, 10, 10, 10);
Upvotes: 1
Reputation: 324197
Your class "is a" GUI and then you also create a new JFrame, so you really have two frames in your code.
However the frame you make visible does not have any components added to it so all you see is the frame.
You then attempt to add components to your class the is a frame. However, you then have two problems:
you never make this frame visible and
Swing uses layout managers (you don't need to use setBounds(...)). By default it is using the BorderLayout. When you add components to the frame without specifying a constraint the components get added to the "CENTER". However, only one component can be displayed in the "CENTER" so only the last one added will ever be visible.
You also have other problems because you don't create the GUI on the Event Dispatch Thread. So there are really too many problems to correct.
I suggest you read the section from the Swing tutorial on How to Use BorderLayout for a working example of how to create a simple GUI. Then modify that code.
Upvotes: 4