I have code that displays a menu and 4 JButtons in a JFrame. I tested the code last night and everything was working fine. Now the JButtons do not appear in the JFrame today in the morning. I tried doing in Eclipse and still I got the same result.
The output I am getting :
My code:
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSeparator;
public class Control {
//JFrame
JFrame main = new JFrame();
//MenuBar
JMenuBar menuBar = new JMenuBar();
//Adding the menu
JMenu fileMenu = new JMenu("File");
JMenu functionMenu = new JMenu("Function");
JMenu helpMenu = new JMenu("Help");
//Adding the Menu Item
JMenuItem addFlight = new JMenuItem("Add Flight");
JMenuItem exit = new JMenuItem("Exit");
JMenuItem landFlight = new JMenuItem("Land Flight");
JMenuItem virtualPath = new JMenuItem("Virtual Path");
JMenuItem flightDetails = new JMenuItem("Flight Details");
JMenuItem about = new JMenuItem("About ...");
//JPanel
JPanel pnlButton = new JPanel();
//Buttons
JButton btnAddFlight = new JButton("Add Flight");
JButton btnLandFlight = new JButton("Land Flight");
JButton btnVirtualPath = new JButton("Virtual Path");
JButton btnFlightDetails = new JButton("Flight Details");
public Control() {
//Adding to the file menu
fileMenu.add(addFlight);
fileMenu.add(exit);
//Adding to the function menu
functionMenu.add(landFlight);
functionMenu.add(virtualPath);
functionMenu.add(flightDetails);
//Adding to the help menu
helpMenu.add(about);
exit.add(new JSeparator());
flightDetails.add(new JSeparator());
//Adding the Menus to the Menu Bar
menuBar.add(fileMenu);
menuBar.add(functionMenu);
menuBar.add(helpMenu);
//FlightInfo setbounds
btnAddFlight.setBounds(30, 30, 120, 30);
btnLandFlight.setBounds(30, 80, 120, 30);
btnVirtualPath.setBounds(30, 130, 120, 30);
btnFlightDetails.setBounds(30, 180, 120, 30);
//JPanel bounds
pnlButton.setLayout(null);
//Adding to JFrame
pnlButton.add(btnAddFlight);
pnlButton.add(btnLandFlight);
pnlButton.add(btnVirtualPath);
pnlButton.add(btnFlightDetails);
main.add(pnlButton);
// JFrame properties
main.setJMenuBar(menuBar);
main.setLayout(null);
main.setBackground(Color.red);
main.setSize(800, 300);
main.setTitle("Air Traffic Control");
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main.setVisible(true);
//Adding the actionlistener
//btnAddFlight.addActionListener(new AddFlight());
//btnLandFlight.addActionListener(new LandFlight());
}
public static void main(String[] args) {
new Control();
}
}
I want to make the JButtons appear on the JFrame.
Many Thanks
You shouldn't add widgets (pnlButton) directly to the JFrame, you need to add them to a sub panel that is automatically created for you called the content pane. To get the content pane do
Container cp = main.getContentPane();
so then do
cp.add(pnlButton);
It's typically a bad idea to use a null layout with absolute positioning, btw.
Use GridBagLayout instead of null layout.
visit the following links for reference
http://www.java2s.com/Code/Java/Swing-JFC/WorkGridBagConstraints3.htm
http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/layout/gridbag.html
Related
Hi everyone ,i`m beginner in programmation and i wanted to make a text editor interface by using java Eclipse and i get problem each time i add scrollbar , the text area disappear ... How can i fix my code to continue on it ?... i saw many tutorials but nothing work>
import java.awt.*;
import java.awt.color.*;
import javax.swing.*;
public class Fenetre extends JFrame {
JMenuBar Menubar = new JMenuBar();
JMenu MenuFichier = new JMenu("Fichier");
JMenuItem MenuFichier1 = new JMenuItem("Nouveau");
JMenuItem MenuFichier2 = new JMenuItem("Ouvrir");
JMenuItem MenuFichier3 = new JMenuItem("Enregister");
JMenuItem MenuFichier4 = new JMenuItem("Enregister sous");
JMenuItem MenuFichier5 = new JMenuItem("Quitter");
JMenu MenuEdition = new JMenu("Edition");
JMenuItem MenuEdition1 = new JMenuItem("Couper");
JMenuItem MenuEdition2 = new JMenuItem("Copier");
JMenuItem MenuEdition3 = new JMenuItem("Coller");
JMenu MenuAide = new JMenu("Aide");
JMenuItem MenuAide1 = new JMenuItem("A propos");
JPanel p=new JPanel();
JScrollPane sp = new JScrollPane ();
JTextArea jt = new JTextArea (90,90);
public Fenetre() {
add(p);
setTitle("Text Editor");
setBounds(100,100, 500, 500);
//setExtendedState(JFrame.MAXIMIZED_BOTH);
sp.add(jt);
jt.setText(null);
jt.setLineWrap(true);
jt.setWrapStyleWord(true);
jt.setVisible(true);
sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
p.add(sp);
sp.setVisible(true);
Menubar.add(MenuFichier);
Menubar.add(MenuEdition);
Menubar.add(MenuAide);
MenuFichier.add(MenuFichier1);
MenuFichier.add(MenuFichier2);
MenuFichier.addSeparator();
MenuFichier.add(MenuFichier3);
MenuFichier.add(MenuFichier4);
MenuFichier.addSeparator();
MenuFichier.add(MenuFichier5);
MenuEdition.add(MenuEdition1);
MenuEdition.add(MenuEdition2);
MenuAide.add(MenuAide1);
Menubar.setBackground(Color.PINK);
getContentPane().add(sp);
setJMenuBar(Menubar);
setVisible(true);
setAlwaysOnTop(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}}
and this is the main of the code
import java.awt.*;
import javax.swing.*;
import java.awt.Color;
public class CreationEditor {
public static void main(String[] args) {
JFrame f = new Fenetre();
}
}
Q1: MY JTextFeild and JMenuBar does not show up, and I don't know why
there is an picture of the program.
Q2: I have seen a lot of ways to write a program of interface, I don't know which way is better. Is this way or this way: https://www.youtube.com/watch?v=706Ye4ubtEY
import javax.swing.*;
import java.awt.*;
import javax.swing.JTextField;
import javax.swing.JMenuBar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Real_Interface extends JFrame implements ActionListener {
public Real_Interface(){
JFrame window = new JFrame();
window.add(new JLabel("Rocket Data Visualization Tool"));
window.setTitle("Rocket Data Visualization Tool");
window.setSize(640, 480);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setVisible(true);
window.setResizable(false);
JTextField tf = new JTextField();
tf.setText("New Text");
String str = tf.getText();
tf.setVisible(true);
JMenuBar bar = new JMenuBar();
JMenu file = new JMenu("File");
JMenuItem menuItem = new JMenuItem("haha");
JMenuItem menuItem2 = new JMenuItem("haha2");
file.add(menuItem);
file.addSeparator();
file.add(menuItem2);
bar.add(file);
JButton button = new JButton("OK");
window.add(button);
button.setBounds(250, 400, 150, 40);
button.addActionListener(this);
}
public static void main(String[] args){
new Real_Interface();
}
public void actionPerformed(ActionEvent e) {
System.out.println("The Button Works!");
Plot.main(null);
}
}
A few reasons
The menubar has not been assigned to the frame
window.setJMenuBar(bar);
The textfield has not been added
window.add(textfield, BorderLayout.PAGE_START);
This component is visible by default so calling setVisible is unnecessary.
The frame needs to be made visible after all components have been added to the frame rather than beforehand
window.setVisible(true);
Your JTextField tf and JMenuBar bar aren't added to their parent (the window ?).
Main thread calls GUI() function that adds frame, menus, menuitems, and a scrollpane with jtable (DefaultTableModel).
If i place the running application to a second display/screen it hangs as soon i switch to a different application or when i try to resize it.
public static void main(String[] args) {
GUI();
}
public static void GUI(){
JButton button;
JMenuBar menuBar;
JMenu menu, submenu;
JMenuItem menuItem;
window = new JFrame();
window.setResizable(false);
//menu
menuBar = new JMenuBar();
menu = new JMenu("Start");
submenu = new JMenu("New");
menu.add(submenu);
menuItem = new JMenuItem("menu1");
menuItem.addActionListener(new buttonActionListener("m1"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu2");
menuItem.addActionListener(new buttonActionListener("m2"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu3");
menuItem.addActionListener(new buttonActionListener("m3"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu4");
menuItem.addActionListener(new buttonActionListener("m4"));
submenu.add(menuItem);
menuBar.add(menu); //start
menu = new JMenu("Options");
menuBar.add(menu); //options
//top panel
JPanel top = new JPanel();
button = new JButton("Paste");
button.addActionListener(new buttonActionListener("paste"));
top.add(button);
button = new JButton("Copy");
button.addActionListener(new buttonActionListener("copy"));
top.add(button);
JButton start = new JButton("Start");
start.addActionListener(new buttonActionListener("start"));
top.add(start);
//main panel with table
main = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
DefaultTableModel model = new DefaultTableModel();
table = new JTable(model);
//bottom panel
JPanel bottom = new JPanel();
Creq = new JCheckBox();
Creq.setSelected(true);
item= new JTextField("item");
comment = new JTextField("comment");
target= new JTextField("target");
req = new JTextField("requirement");
bottom.add(Creq);
bottom.add(req);
bottom.add(item);
depToUpdate.setVisible(true);
bottom.add(target);
targetDep.setVisible(true);
bottom.add(comment);
comment.setVisible(true);
window.setJMenuBar(menuBar);
window.add(top, BorderLayout.NORTH);
window.add(main, BorderLayout.CENTER);
window.add(bottom, BorderLayout.SOUTH);
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setVisible(true);
}
After spending way too much time fixing the code so that it would actually run in Java, I tested the GUI on my second monitor in Windows 8. The GUI didn't do anything, but it didn't freeze either.
Here are the problems I fixed:
I moved the Swing GUI code into a regular class method (not static).
I put the Swing components on the Event Dispatch thread. You must always create and execute your Swing components on the Event Dispatch thread.
Here's the version of the code I ran.
package snippet;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class Snippet implements Runnable{
private JCheckBox creq;
private JFrame window;
private JScrollPane main;
private JTable table;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Snippet());
}
#Override
public void run() {
JButton button;
JMenuBar menuBar;
JMenu menu, submenu;
JMenuItem menuItem;
window = new JFrame();
window.setResizable(false);
// menu
menuBar = new JMenuBar();
menu = new JMenu("Start");
submenu = new JMenu("New");
menu.add(submenu);
menuItem = new JMenuItem("menu1");
// menuItem.addActionListener(new buttonActionListener("m1"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu2");
// menuItem.addActionListener(new buttonActionListener("m2"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu3");
// menuItem.addActionListener(new buttonActionListener("m3"));
submenu.add(menuItem);
menuItem = new JMenuItem("menu4");
// menuItem.addActionListener(new buttonActionListener("m4"));
submenu.add(menuItem);
menuBar.add(menu); // start
menu = new JMenu("Options");
menuBar.add(menu); // options
// top panel
JPanel top = new JPanel();
button = new JButton("Paste");
// button.addActionListener(new buttonActionListener("paste"));
top.add(button);
button = new JButton("Copy");
// button.addActionListener(new buttonActionListener("copy"));
top.add(button);
JButton start = new JButton("Start");
// start.addActionListener(new buttonActionListener("start"));
top.add(start);
// main panel with table
// main = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
// ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
DefaultTableModel model = new DefaultTableModel();
table = new JTable(model);
main = new JScrollPane(table);
// bottom panel
JPanel bottom = new JPanel();
creq = new JCheckBox();
creq.setSelected(true);
JTextField item = new JTextField("item");
JTextField comment = new JTextField("comment");
JTextField target = new JTextField("target");
JTextField req = new JTextField("requirement");
bottom.add(creq);
bottom.add(req);
bottom.add(item);
// depToUpdate.setVisible(true);
bottom.add(target);
// targetDep.setVisible(true);
bottom.add(comment);
comment.setVisible(true);
window.setJMenuBar(menuBar);
window.add(top, BorderLayout.NORTH);
window.add(main, BorderLayout.CENTER);
window.add(bottom, BorderLayout.SOUTH);
window.pack();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLocationRelativeTo(null);
window.setVisible(true);
}
}
I am trying to build an app that has some components such as buttons, labels, text fields, a menu bar and a picture (I didn't tackle the image problem yet so there is no code for that).
So I made a grid layout for my frame and constructed 6 panels with their respective components as explained in the code bellow. But when I run it it doesn't show anything at first, just a blank frame, unless I maximize the window. Because when I do that everything appears to be working fine. Except for 2 things.
I have setVgap() and setHgap() to zero but there are still gaps between the components. and the 2nd thing is that the BorderLayout.NORTH, (..).SOUTH etc don't seem to work either.
public class Window extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel menupanel = new JPanel();
public Window() {
super("Image Application");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
requestFocus();
// Setting Layout
GridLayout grid = new GridLayout(6, 0, 0, 0);
//grid.setVgap(0);
//grid.setHgap(0);
this.setLayout(grid);
// Menu
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("Options");
JButton button = new JButton("Reset");
// Buttons
menupanel.add(new JButton("Allign Left"));
menupanel.add(new JButton("Allign Center"));
menupanel.add(new JButton("Allign Right"));
// Picture
JPanel p1 = new JPanel();
// 2x JLabels and ComboBoxes to get the preferred dimensions
JPanel p2 = new JPanel();
JPanel p3 = new JPanel();
JLabel b2 = new JLabel("Width: ");
JLabel b3 = new JLabel("Height: ");
JTextField box1 = new JTextField(25);
JTextField box2 = new JTextField(25);
// Resize Button
JPanel p4 = new JPanel();
JButton b4 = new JButton("Resize");
// Adding Components to their panels
p2.add(b2);
p2.add(box1);
p3.add(b3);
p3.add(box2);
p4.add(b4);
menu.add(button);
menubar.add(menu);
// add all of the panels to JFrame
this.add(menupanel);
this.add(p1, BorderLayout.NORTH);
this.add(p2, BorderLayout.SOUTH);
this.add(p3, BorderLayout.WEST);
this.add(p4, BorderLayout.EAST);
this.setJMenuBar(menubar);
pack();
setVisible(true);
}
public static void main(String args[]) {
Window w = new Window();
}
}
Any ideas?
~EDIT1 changed according to first 2 comments, the pack(); seems to fix the problem that i needed to maximise the window to see the comp's ( -Thanks ), but the setVgap() problem remains.
~EDIT2 when I run it this window is shown:
While I want it to look more like this:
AGAIN Ignore the picture
~EDIT3 Well, I changed the value that was passed in the constructor for the Hgap and it does change accordingly for different values but it seems that zero Hgap is still ~10 pixels wide?! Also I noted that the gap doesn't change between the menubar and the first Jbuttons, but only for the ret of the components.
~EDIT4 It also works for negative int's..?! I am lost here..
please to compare, you should using second parameter for GridLayout, then setVgap() will works (frame.setLayout(new GridLayout(6, 0, 5, 5));), here is only zero value,
Window is reserved word in Java for awt.Window, don't to use this Object name as class name
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class MyWindow {
private static final long serialVersionUID = 1L;
private JPanel menupanel = new JPanel();
private JFrame frame = new JFrame("Image Application");
public MyWindow() {
// Menu
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("Options");
JButton button = new JButton("Reset");
// Buttons
menupanel.add(new JButton("Allign Left"));
menupanel.add(new JButton("Allign Center"));
menupanel.add(new JButton("Allign Right"));
// Picture
JPanel p1 = new JPanel();
p1.setBackground(Color.RED);
// 2x JLabels and ComboBoxes to get the preferred dimensions
JPanel p2 = new JPanel();
p2.setBackground(Color.ORANGE);
JLabel b2 = new JLabel("Width: ");
p2.add(b2);
JTextField box1 = new JTextField(25);
p2.add(box1);
JPanel p3 = new JPanel();
p3.setBackground(Color.BLUE);
JLabel b3 = new JLabel("Height: ");
JTextField box2 = new JTextField(25);
p3.add(b3);
p3.add(box2);
// Resize Button
JPanel p4 = new JPanel();
p4.setBackground(Color.MAGENTA);
JButton b4 = new JButton("Resize");
// Adding Components to their panels
p4.add(b4);
menu.add(button);
menubar.add(menu);
// add all of the panels to JFrame
frame.setLayout(new GridLayout(6, 0, 5, 5));
frame.add(menupanel);
frame.add(p1);
frame.add(p2);
frame.add(p3);
frame.add(p4);
frame.setJMenuBar(menubar);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
#Override
public void run() {
MyWindow w = new MyWindow();
}
});
}
}
Basically, i am trying to make it so there are 3 buttons on the bottom of the screen and then have a label which has words in it in the middle of the screen. However, i cant seem to have both buttons and the label in the GUI at the same time. I am a beginner and dont know much about layouts (even though i have read into them) so any help/guidance would be helpful on why i cannot see both the label and the buttons.enter code here
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class AWorldPanel implements ActionListener {
/** Declaring all the menu items within the GUI **/
private JMenuItem Fileitem1 = new JMenuItem("New configuration");
private JMenuItem Fileitem2 = new JMenuItem("Open configuration file ");
private JMenuItem Fileitem3 = new JMenuItem("Save");
private JMenuItem Fileitem4 = new JMenuItem("Save As");
private JMenuItem Fileitem5 = new JMenuItem("Exit");
private JMenuItem Viewitem1 = new JMenuItem("Display configuration");
private JMenuItem Viewitem2 = new JMenuItem("Edit configuration");
private JMenuItem Viewitem3 = new JMenuItem("Info about Bugs");
private JMenuItem Viewitem4 = new JMenuItem("Info about Map");
private JMenuItem Edititem1 = new JMenuItem("Remove");
private JMenuItem Edititem2 = new JMenuItem("Add");
private JMenuItem Simulationitem1 = new JMenuItem("Simulation");
private JMenuItem Helpitem1 = new JMenuItem("Info about application");
private JMenuItem Helpitem2 = new JMenuItem("Info about author");
private JLabel theLabel;
private JPanel thePanel;
JButton Run, Pause, Reset;
JFrame GUI = new JFrame("Graphical User Interface");
private static AWorld guiworld;
public AWorldPanel() {
/** Creating the menu **/
JMenuBar menubar = new JMenuBar();
JMenu File = new JMenu("File");
JMenu View = new JMenu("View");
JMenu Edit = new JMenu("Edit");
JMenu Help = new JMenu("Help");
/** welcome label **/
theLabel = new JLabel("Hello ", JLabel.CENTER);
theLabel.setVisible(true);
theLabel.setVerticalTextPosition(JLabel.TOP);
theLabel.setHorizontalTextPosition(JLabel.CENTER);
/** file sub menus **/
menubar.add(File);
File.add(Fileitem1);
File.add(Fileitem2);
File.add(Fileitem3);
File.add(Fileitem4);
File.add(Fileitem5);
menubar.add(View);
View.add(Viewitem1);
View.add(Viewitem2);
View.add(Viewitem3);
View.add(Viewitem4);
menubar.add(Edit);
Edit.add(Edititem1);
Edit.add(Edititem2);
menubar.add(Help);
Help.add(Helpitem1);
Help.add(Helpitem2);
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.setBorder(new EmptyBorder(new Insets(300, 125, 100, 100)));
Run = new JButton("Run");
Pause = new JButton("Pause");
Reset = new JButton("Reset");
panel.add(Run);
panel.add(Box.createRigidArea(new Dimension(0, 5)));
panel.add(Pause);
panel.add(Box.createRigidArea(new Dimension(0, 5)));
panel.add(Reset);
GUI.add(panel);
GUI.add(theLabel);
GUI.setJMenuBar(menubar);
}
private static void createAndShowGUI() {
AWorldPanel newworld = new AWorldPanel();
// Create the container
JFrame frame = new JFrame("Graphical User Interface");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// changing the menu settings
newworld.GUI.setLocation(300, 100);
newworld.GUI.setSize(500, 500);
newworld.GUI.setVisible(true);// Now the frame will appear on screen
}
public static void main(String args[]) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
The default layout manager for a JFrame is a BorderLayout. If you don't specify a constraint then the component will be added to the BorderLayout.CENTER. You can't add multiple components to the same location in the layout. Try something like:
GUI.add(panel, BorderLayout.SOUTH);
GUI.add(theLabel, BorderLayout.CENTER);
Also, learn standard Java naming conventions. Every book, tutorial or example you will read uses these standards so don't make up your own conventions. Variable names do not start with an upper case character.