I'm making a flash card application, and I'm trying to get it to where is has a JLabel at the top that says what the active set of flash cards is. The way I have it set up though, is that when the user clicks the "Add Set" button, it creates a button at the bottom with no real label to be called on.
So I was using ActionListener to try and get the label of the button itself, but the JLabel just shows the title of the Add Set button and doesn't change whenever a different button is clicked.
Heres my code:
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Scanner;
public class GraphicsUI extends JPanel {
private DeckList setsList;
CardActions action = new CardActions();
JButton addSetButton, addCardButton;
private JLabel label;
private JPanel actives, optionsPanel,cardPanel, flashCardsPanel, bottomPanel;
private String name;
public GraphicsUI(){
this.setPreferredSize(new Dimension(1000,825));
this.setBackground(Color.LIGHT_GRAY);
actives = new JPanel();
actives.setPreferredSize(new Dimension(1000, 50));
actives.setBackground(Color.blue);
this.add(actives);
label = new JLabel();
actives.add(label);
optionsPanel = new JPanel();
optionsPanel.setPreferredSize(new Dimension(200, 350));
optionsPanel.setBackground(Color.cyan);
this.add(optionsPanel);
cardPanel = new JPanel();
cardPanel.setPreferredSize(new Dimension(580, 350));
cardPanel.setBackground(Color.green);
this.add(cardPanel);
flashCardsPanel = new JPanel();
flashCardsPanel.setPreferredSize(new Dimension(200, 350));
flashCardsPanel.setBackground(Color.white);
this.add(flashCardsPanel);
bottomPanel = new JPanel();
bottomPanel.setLayout(new FlowLayout());
bottomPanel.setPreferredSize(new Dimension(1000, 400));
bottomPanel.setBackground(Color.black);
this.add(bottomPanel);
this.addSetButton = new JButton("Add Set");
addSetButton.setPreferredSize(new Dimension(150, 30));
optionsPanel.add(addSetButton, BorderLayout.WEST);
addSetButton.addActionListener(new ButtonListener());
}
public class ButtonListener implements ActionListener{
#Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
label.setText("Active set: " + e.getActionCommand());
if(e.getSource() ==addSetButton){
action.setCommand(CardActions.Command.ADDSET);
action.setList(getSetInfo());
}
}
}
private CardList getSetInfo(){
CardList cl = new CardList();
String setName = JOptionPane.showInputDialog("Enter the name of your set.");
if(setName.isEmpty()){
JOptionPane.showMessageDialog(this, "Cannot have an empty set.");
}
else{
cl.setSetName(setName);
ImageIcon img = new ImageIcon("setIcon.png");
JButton newset = new JButton(setName);
newset.setIcon(img);
newset.setBackground(Color.white);
bottomPanel.add(newset);
bottomPanel.revalidate();
}
return cl;
}
}
i think you forgot to add an ActionListener to your newSet Button, below you'll find a working example. I commented the two lines with the icon, so uncomment and try it.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
*
* #author ottp
* #version 1.0
*/
public class CardPanel extends JPanel {
final private JLabel label;
private JButton addSetButton;
private JPanel actives, optionsPanel,cardPanel, flashCardsPanel, bottomPanel;
public CardPanel() {
actives = new JPanel();
actives.setPreferredSize(new Dimension(1000, 50));
actives.setBackground(Color.BLUE);
this.add(actives);
label = new JLabel();
actives.add(label);
optionsPanel = new JPanel();
optionsPanel.setPreferredSize(new Dimension(200, 350));
optionsPanel.setBackground(Color.cyan);
this.add(optionsPanel);
cardPanel = new JPanel();
cardPanel.setPreferredSize(new Dimension(580, 350));
cardPanel.setBackground(Color.green);
this.add(cardPanel);
flashCardsPanel = new JPanel();
flashCardsPanel.setPreferredSize(new Dimension(200, 350));
flashCardsPanel.setBackground(Color.white);
this.add(flashCardsPanel);
bottomPanel = new JPanel();
bottomPanel.setLayout(new FlowLayout());
bottomPanel.setPreferredSize(new Dimension(1000, 400));
bottomPanel.setBackground(Color.black);
this.add(bottomPanel);
this.addSetButton = new JButton("Add Set");
addSetButton.setPreferredSize(new Dimension(150, 30));
optionsPanel.add(addSetButton, BorderLayout.WEST);
addSetButton.addActionListener(new ButtonListener());
}
public class ButtonListener implements ActionListener {
#Override
public void actionPerformed(ActionEvent e) {
label.setForeground(Color.WHITE);
label.setText("Active set: " + e.getActionCommand());
if(e.getSource().equals(addSetButton)) {
getSetInfo();
}
}
}
private void getSetInfo() {
String newSetName =
JOptionPane.showInputDialog(cardPanel, "Enter the name of your set", JOptionPane.INFORMATION_MESSAGE);
JButton newSet = new JButton(newSetName);
newSet.setBackground(Color.WHITE);
newSet.addActionListener(new ButtonListener());
bottomPanel.add(newSet);
bottomPanel.revalidate();
}
}
Greets
Patrick
Related
hello guys hope so all are doing well I am new to java swing and and trying build very simple app and I am stocked in problem that I was trying to open jpanal that contain a form in main dashboard I am attaching some pics of gui please see and let me know is there any way to add that form to main dashboard
my program structure is:
one dashboard class that contain button of add and a jpanal that can hold that form
one form class that contain form
I am trying to display this form into main dashboard jpanal
package school_management_system;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
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.JPanel;
public class dashboard extends JFrame implements ActionListener {
JLabel header_label=new JLabel();
JPanel panel_header=new JPanel();
JPanel panel_left=new JPanel();
JPanel panel_center=new JPanel();
JPanel panel_left_sub1=new JPanel();
JPanel panel_left_sub2=new JPanel();
JPanel panel_left_sub3=new JPanel();
JButton add_item_bt=new JButton();
JButton update_item_bt=new JButton();
JButton add_customer_bt=new JButton();
dashboard()
{
setlocandsize();
designcomponents();
this.setVisible(true);
this.setSize(620, 620);
this.setLayout(new BorderLayout());
this.add(panel_header, BorderLayout.NORTH);
this.add(panel_left, BorderLayout.WEST);
this.add(panel_center, BorderLayout.CENTER);
add_item_bt.addActionListener(this);
panel_header.add(header_label);
panel_left.add(panel_left_sub1, BorderLayout.NORTH);
panel_left.add(panel_left_sub2, BorderLayout.NORTH);
panel_left.add(panel_left_sub3, BorderLayout.NORTH);
panel_left_sub1.add(add_item_bt);
panel_left_sub2.add(update_item_bt);
panel_left_sub3.add(add_customer_bt);
}
public void setlocandsize()
{
panel_header.setPreferredSize(new Dimension(100,100));
panel_left.setPreferredSize(new Dimension(150,150));
panel_center.setPreferredSize(new Dimension(100,100));
panel_left_sub1.setPreferredSize(new Dimension(130,50));
panel_left_sub2.setPreferredSize(new Dimension(130,50));
panel_left_sub3.setPreferredSize(new Dimension(130,50));
add_item_bt.setPreferredSize(new Dimension(120,30));
update_item_bt.setPreferredSize(new Dimension(120,30));
add_customer_bt.setPreferredSize(new Dimension(120,30));
panel_left.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
panel_left_sub1.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panel_left_sub2.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panel_left_sub3.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panel_header.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
}
public void designcomponents()
{
panel_header.setBackground(Color.red);
panel_left.setBackground(Color.blue);
panel_center.setBackground(Color.DARK_GRAY);
panel_left_sub1.setBackground(Color.yellow);
panel_left_sub2.setBackground(Color.green);
panel_left_sub3.setBackground(Color.orange);
add_item_bt.setText("Add Item");
update_item_bt.setText("Update item");
add_customer_bt.setText("Add Customer");
header_label.setText("Staff Dashboard");
header_label.setFont(new Font("MV Boli",Font.BOLD,20));
}
#Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==add_item_bt)
{
new add_item();
}
}
}
'
'
package school_management_system;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class add_item extends JFrame {
JPanel add_item_panel=new JPanel();
JLabel item_panel_label=new JLabel();
JLabel item_name_label=new JLabel();
JTextField item_name_tf=new JTextField();
JLabel item_price_label=new JLabel();
JTextField item_price_tf=new JTextField();
JButton add_item_bt=new JButton();
JDialog add_item_dialog=new JDialog();
add_item()
{
JDialog d1;
d1=new JDialog();
setlocandsize();
designcomponents();
d1.setLayout(new BorderLayout());
d1.add(add_item_panel);
d1.setVisible(true);
d1.setSize(500, 500);
add_item_panel.add(item_panel_label);
add_item_panel.add(item_name_label);
add_item_panel.add(item_name_tf);
add_item_panel.add(item_price_label);
add_item_panel.add(item_price_tf);
add_item_panel.add(add_item_bt);
}
public void setlocandsize()
{
add_item_panel.setBounds(100, 50, 400, 400);
add_item_panel.setLayout(null);
add_item_panel.setBackground(Color.gray);
item_panel_label.setBounds(130, 0, 200, 100);
item_name_label.setBounds(90, 60, 100, 100);
item_name_tf.setBounds(210, 95, 100, 25);
item_price_label.setBounds(90, 100, 100, 100);
item_price_tf.setBounds(210, 135, 100, 25);
add_item_bt.setBounds(230, 175, 80, 25);
}
public void designcomponents()
{
item_panel_label.setText("Add Item");
item_panel_label.setFont(new Font("MV Boli",Font.BOLD,30));
item_name_label.setText("Item Name:");
item_name_label.setFont(new Font("MV Boli",Font.BOLD,15));
item_price_label.setText("Item Name:");
item_price_label.setFont(new Font("MV Boli",Font.BOLD,15));
add_item_bt.setText("Add");
}
}
'
First, let's fix some issues with the GUI. Read the comment to follow the changes :
//rename to follow naming conventions
public class Dashboard extends JFrame implements ActionListener {
//rename to follow naming conventions
JLabel headerLabel=new JLabel();
JPanel panelHeader=new JPanel();
JPanel panelLeft=new JPanel();
JPanel panelCenter=new JPanel();
JPanel panelLeftSub1=new JPanel();
JPanel panelLeftSub2=new JPanel();
JPanel panelLeftSub3=new JPanel();
JButton addItemBtn=new JButton();
JButton updateItemBtn=new JButton();
JButton addCustomerBtn=new JButton();
Dashboard()
{
setlocandsize();
designcomponents();
//this.setSize(620, 620); let pack() size the window to its children
this.setLayout(new BorderLayout());
this.add(panelHeader, BorderLayout.NORTH);
this.add(panelLeft, BorderLayout.WEST);
this.add(panelCenter, BorderLayout.CENTER);
addItemBtn.addActionListener(this);
panelHeader.add(headerLabel);
//JPanel uses FlowLayout as default so BorderLayout.NORTH has no effect;
panelLeft.add(panelLeftSub1);
panelLeft.add(panelLeftSub2);
panelLeft.add(panelLeftSub3);
panelLeftSub1.add(addItemBtn);
panelLeftSub2.add(updateItemBtn);
panelLeftSub3.add(addCustomerBtn);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);//always at the end
}
public void setlocandsize()
{
//todo override getPreferredSize instead of setting proffered size
panelHeader.setPreferredSize(new Dimension(100,100));
panelLeft.setPreferredSize(new Dimension(150,250));
panelCenter.setPreferredSize(new Dimension(100,100));
panelLeftSub1.setPreferredSize(new Dimension(130,50));
panelLeftSub2.setPreferredSize(new Dimension(130,50));
panelLeftSub3.setPreferredSize(new Dimension(130,50));
//typically there is no need to set size of buttons
//addItemBtn.setPreferredSize(new Dimension(120,30));
//updateItemBtn.setPreferredSize(new Dimension(120,30));
//addCustomerBtn.setPreferredSize(new Dimension(120,30));
panelLeft.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
panelLeftSub1.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panelLeftSub2.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panelLeftSub3.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panelHeader.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
}
public void designcomponents()
{
panelHeader.setBackground(Color.red);
panelLeft.setBackground(Color.blue);
panelCenter.setBackground(Color.DARK_GRAY);
panelLeftSub1.setBackground(Color.yellow);
panelLeftSub2.setBackground(Color.green);
panelLeftSub3.setBackground(Color.orange);
addItemBtn.setText("Add Item");
updateItemBtn.setText("Update item");
addCustomerBtn.setText("Add Customer");
headerLabel.setText("Staff Dashboard");
headerLabel.setFont(new Font("MV Boli",Font.BOLD,20));
}
#Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==addItemBtn)
{
new AddItem();
}
}
public static void main(String[] args) {
new Dashboard();
}
}
//rename to follow naming conventions and use JDialog
class AddItem extends JDialog {
JPanel addItemPanel=new JPanel();
JLabel itemPanelLabel=new JLabel();
JTextField itemNameTf=new JTextField(15);//set size of TF by setting columns
JTextField itemPriceTf=new JTextField(15);
JButton additemBtn=new JButton();
AddItem()
{
designcomponents();
setLayout(new BorderLayout());
add(addItemPanel);
addItemPanel.setLayout(new BoxLayout(addItemPanel, BoxLayout.PAGE_AXIS));
addItemPanel.add(itemPanelLabel);
addItemPanel.add(makeEntryPanel("Item Name:", itemNameTf));
addItemPanel.add(makeEntryPanel("Item Price:", itemPriceTf));
addItemPanel.add(additemBtn);
addItemPanel.setBackground(Color.gray);
pack();
setVisible(true);
}
public void designcomponents()
{
itemPanelLabel.setText("Add Item");
itemPanelLabel.setFont(new Font("MV Boli",Font.BOLD,30));
additemBtn.setText("Add");
}
private JPanel makeEntryPanel(String text, JTextField tf ){
JPanel entry = new JPanel();
JLabel label = new JLabel(text);
label.setFont(new Font("MV Boli",Font.BOLD,15));
entry.add(label);
entry.add(tf);
return entry;
}
}
Next introduce an Item object:
class Item {
private String name;
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
Now modify Dashboard and AddItem to use and share an Item:
Modify Dashboard to construct an Item object, and open AddItem dialog that configures that object:
public class Dashboard extends JFrame {
JLabel headerLabel=new JLabel();
JPanel panelHeader=new JPanel();
JPanel panelLeft=new JPanel();
JPanel panelCenter=new JPanel();
JPanel panelLeftSub1=new JPanel();
JPanel panelLeftSub2=new JPanel();
JPanel panelLeftSub3=new JPanel();
JButton addItemBtn=new JButton();
JButton updateItemBtn=new JButton();
JButton addCustomerBtn=new JButton();
Dashboard()
{
setlocandsize();
designcomponents();
this.setLayout(new BorderLayout());
this.add(panelHeader, BorderLayout.NORTH);
this.add(panelLeft, BorderLayout.WEST);
this.add(panelCenter, BorderLayout.CENTER);
addItemBtn.addActionListener(e-> addItem());
panelHeader.add(headerLabel);
panelLeft.add(panelLeftSub1);
panelLeft.add(panelLeftSub2);
panelLeft.add(panelLeftSub3);
panelLeftSub1.add(addItemBtn);
panelLeftSub2.add(updateItemBtn);
panelLeftSub3.add(addCustomerBtn);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);//always at the end
}
public void setlocandsize()
{
//todo override getPreferredSize instead of setting proffered size
panelHeader.setPreferredSize(new Dimension(100,100));
panelLeft.setPreferredSize(new Dimension(150,250));
panelCenter.setPreferredSize(new Dimension(100,100));
panelLeftSub1.setPreferredSize(new Dimension(130,50));
panelLeftSub2.setPreferredSize(new Dimension(130,50));
panelLeftSub3.setPreferredSize(new Dimension(130,50));
panelLeft.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
panelLeftSub1.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panelLeftSub2.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panelLeftSub3.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
panelHeader.setLayout(new FlowLayout(FlowLayout.CENTER,10,20));
}
public void designcomponents()
{
panelHeader.setBackground(Color.red);
panelLeft.setBackground(Color.blue);
panelCenter.setBackground(Color.DARK_GRAY);
panelLeftSub1.setBackground(Color.yellow);
panelLeftSub2.setBackground(Color.green);
panelLeftSub3.setBackground(Color.orange);
addItemBtn.setText("Add Item");
updateItemBtn.setText("Update item");
addCustomerBtn.setText("Add Customer");
headerLabel.setText("Staff Dashboard");
headerLabel.setFont(new Font("MV Boli",Font.BOLD,20));
}
private void addItem(){
Item item = new Item();
new AddItem(item); //invoke AddItem that updates item
//after AddItem is closed, print details for testing
System.out.println(item.getName() + " price:" + item.getPrice());
//todo display details in gui
}
public static void main(String[] args) {
new Dashboard();
}
}
the modal AddItem configures the shared Item object and closes when done:
class AddItem extends JDialog {
private final Item item;
JPanel addItemPanel=new JPanel();
JLabel itemPanelLabel=new JLabel();
JTextField itemNameTf=new JTextField(15);//set size of TF by setting columns
JTextField itemPriceTf=new JTextField(15);
JButton additemBtn=new JButton();
AddItem(Item item)
{
this.item = item;
setModal(true);
designcomponents();
setLayout(new BorderLayout());
add(addItemPanel);
addItemPanel.setLayout(new BoxLayout(addItemPanel, BoxLayout.PAGE_AXIS));
addItemPanel.add(itemPanelLabel);
addItemPanel.add(makeEntryPanel("Item Name:", itemNameTf));
addItemPanel.add(makeEntryPanel("Item Price:", itemPriceTf));
addItemPanel.add(additemBtn);
addItemPanel.setBackground(Color.gray);
pack();
setVisible(true);
}
public void designcomponents()
{
itemPanelLabel.setText("Add Item");
itemPanelLabel.setFont(new Font("MV Boli",Font.BOLD,30));
additemBtn.setText("Add");
additemBtn.addActionListener(e->updateItemDetails());
}
private void updateItemDetails() {
//todo check input
//configure item
item.setName(itemNameTf.getText());
item.setPrice(Double.valueOf(itemPriceTf.getText()));
dispose();//close dialog
}
private JPanel makeEntryPanel(String text, JTextField tf ){
JPanel entry = new JPanel();
JLabel label = new JLabel(text);
label.setFont(new Font("MV Boli",Font.BOLD,15));
entry.add(label);
entry.add(tf);
return entry;
}
}
I have been trying to pass the info of my JTextField that is in a JDialog into my JFrame. Both the JDialog and JFrame are in separate classes. I have tried to store the JTextField into a JLable using the .setText and .getText and then passing the JLable into the JFrame but with no luck.
I know there are many similar questions but I have tried many different approaches but still no luck. I am relatively new to Java and do not know all the in's and out's. Any help is very appreciated!
My code for the JFrame:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JPanel;
public class StockApp extends JFrame implements PropertyChangeListener {
private JPanel main = new JPanel();
private JPanel north = new JPanel();
private JPanel center = new JPanel();
private JPanel south = new JPanel();
private JButton buyStock = new JButton("Buy Stock");
private JButton sellStock = new JButton("Sell Stock");
public TestTest variables = new TestTest();
private JLabel stockNameNorth = new JLabel("Stock Name");
private JLabel stockPriceNorth = new JLabel("Stock Price");
String stockName = variables.getStockName();
String stockPrice = variables.getStockPrice();
public StockApp() {
setTitle("StockApp");
getContentPane().setBackground(Color.white);
setSize(400,400);
setLocation(500,200);
setVisible(true);
main.setLayout(new BorderLayout());
north.setLayout(new FlowLayout());
center.setLayout(new FlowLayout());
south.setLayout(new FlowLayout());
stockNameNorth.setText(stockName);
stockPriceNorth.setText(stockPrice);
add(main);
north.add(stockNameNorth);
north.add(stockPriceNorth);
south.add(buyStock);
south.add(sellStock);
main.add(north, BorderLayout.NORTH);
main.add(center, BorderLayout.CENTER);
main.add(south, BorderLayout.SOUTH);
}
}
And Dialog:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestTest extends JDialog implements ActionListener {
private JPanel main = new JPanel();
private JPanel north = new JPanel();
private JPanel center = new JPanel();
private JPanel south = new JPanel();
private JLabel stockNameLabel = new JLabel("Stock name: ");
private JLabel stockPriceLabel = new JLabel("Stock price(£): ");
private JTextField stockNameIn = new JTextField(5);
private JTextField stockPriceIn = new JTextField(5);
private JButton buttonOK = new JButton("OK");
public JLabel stockPrice = new JLabel();
public JLabel stockName = new JLabel();
public TestTest() {
getContentPane().setBackground(Color.white);
setSize(400,400);
setLocation(500,200);
setModal(false);
setVisible(true);
getRootPane().setDefaultButton(buttonOK);
main.setLayout(new BorderLayout());
north.setLayout(new FlowLayout());
center.setLayout(new FlowLayout());
south.setLayout(new FlowLayout());
add(main);
north.add(stockNameLabel);
north.add(stockNameIn);
center.add(stockPriceLabel);
center.add(stockPriceIn);
south.add(buttonOK);
main.add(north, BorderLayout.NORTH);
main.add(center, BorderLayout.CENTER);
main.add(south, BorderLayout.SOUTH);
buttonOK.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == buttonOK){
stockName.setText(stockNameIn.getText());
stockPrice.setText(stockPriceIn.getText());
dispose();
new StockApp();
}
}
public String getStockName() {
return stockNameIn.getText();
}
public String getStockPrice() {
return stockPriceIn.getText();
}
}
I am trying to pass the stockName and stockPrice variables from the JDialog into the JFrame. I then want the name and price to display at the top of the JFrame.
For demonstration, what the problem is, we need less Fields and Buttons.
So far, no component of StockApp needs to be accessed from different methods, so there is no need to make them visible outside of the ctor.
More explanations in the code.
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JPanel;
public class StockApp extends JFrame {
public StockApp() {
// move those unreferenced panels here, so we don't have to reason about them:
JPanel main = new JPanel();
JPanel north = new JPanel();
JPanel center = new JPanel();
JPanel south = new JPanel();
// add price later, when name works
JButton buyStock = new JButton("Buy Stock");
JLabel stockNameNorth = new JLabel("Stock Name");
// critical change: Make the label, which you like to update,
// accessible by whom it should be updated:
TestTest variables = new TestTest (stockNameNorth);
setTitle ("StockApp");
getContentPane().setBackground(Color.white);
setSize (600,400);
setLocation (500,200);
setVisible (true);
// make the close-frame action terminate the program:
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
main.setLayout (new BorderLayout());
north.setLayout (new FlowLayout());
center.setLayout (new FlowLayout());
south.setLayout (new FlowLayout());
add (main);
north.add (stockNameNorth);
south.add (buyStock);
main.add (north, BorderLayout.NORTH);
main.add (center, BorderLayout.CENTER);
main.add (south, BorderLayout.SOUTH);
}
// Main method to start the damn thing
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
#Override
public void run() {
new StockApp ();
}
});
}
}
// no need to make this class public in a short test:
class TestTest extends JDialog implements ActionListener {
// this are elements, visible outside the construction phase,
// we need to have access to from more than one method.
// Make this important distinction visible to the reader:
JLabel name;
JTextField stockNameIn = new JTextField (5);
JButton buttonOK = new JButton ("OK");
// add the JLabel to update to the ctor, so that it can't be forgotten
// to be set
public TestTest (JLabel pname) {
// we copy the reference to the label, to have access to it in
// the actionPerformed method.
name = pname;
JPanel main = new JPanel();
JPanel north = new JPanel();
JPanel center = new JPanel();
JPanel south = new JPanel();
JLabel stockNameLabel = new JLabel ("Stock name: ");
getContentPane().setBackground(Color.white);
// different size/location than frame, so that they don't hide
// each other completly
setSize (400,600);
setLocation (700,300);
setModal (false);
setVisible (true);
getRootPane().setDefaultButton(buttonOK);
main.setLayout (new BorderLayout());
north.setLayout (new FlowLayout());
center.setLayout (new FlowLayout());
south.setLayout (new FlowLayout());
add (main);
north.add (stockNameLabel);
north.add (stockNameIn);
south.add (buttonOK);
main.add (north, BorderLayout.NORTH);
main.add (center, BorderLayout.CENTER);
main.add (south, BorderLayout.SOUTH);
buttonOK.addActionListener(this);
}
// here we need access to the button - was it the OK-Button, clicked?
// and the textfield stockNameIn, to read the text
// and the name field from the frame, to set the text
public void actionPerformed(ActionEvent e) {
if (e.getSource () == buttonOK) {
name.setText (stockNameIn.getText());
dispose();
}
}
}
I'll try to explain the problem as best i can.
Basically what I have is a system that takes in customer data (Customer is an object) and then adds it to an array. I have that working no problems. What I'm trying to get working is that I also have an option that should enable the user to edit a customers details. The way I'm trying to implement this is; in a separate GUI, I have a comboBox which will be populated with all of the customers first names that are currently in the arrayList. This also works.
Here is my problem - what I want to happen is that when one of the customers first names is chosen from the comboBox, it should find that object, and then fill out the JTextFields with its respective data, e.g. that customers first name should pop into the first name textField and his second name into the second name TextField etc..
I cant figure out this problem so any help is appreciated!
This is only one of a few classes, the rest of which work.
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.text.MaskFormatter;
import javax.swing.JLabel;
import java.awt.SystemColor;
import java.text.ParseException;
import java.util.ArrayList;
import java.awt.Font;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.UIManager;
import java.awt.GridLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
public class editCustomers extends JFrame {
private JPanel contentPane;
private JTextField textField;
private JTextField textField_1;
private JTextField textField_2;
private JTextField textField_3;
ArrayList<Customers> customerList;
private MaskFormatter mask = null;
/**
* Create the frame.
*/
public editCustomers(ArrayList<Customers> aList) {
customerList = aList;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 700, 600);
setLocationRelativeTo(null);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JPanel panel = new JPanel();
contentPane.add(panel, BorderLayout.CENTER);
panel.setLayout(new GridLayout(6, 0, 0, 0));
JPanel panel_12 = new JPanel();
panel.add(panel_12);
panel_12.setLayout(new BorderLayout(0, 0));
JLabel lblSelectACustomer = new JLabel("Select a Customer to Edit");
panel_12.add(lblSelectACustomer, BorderLayout.WEST);
JComboBox comboBox = new JComboBox();
//comboBox.setModel(new DefaultComboBoxModel());
for (Customers temp : customerList) {
comboBox.addItem(temp.getfName());
}
panel_12.add(comboBox, BorderLayout.EAST);
JPanel panel_3 = new JPanel();
panel.add(panel_3);
panel_3.setLayout(new BorderLayout(0, 0));
JLabel lbl1 = new JLabel("Edit Customers First Name");
lbl1.setVerticalAlignment(SwingConstants.TOP);
Dimension d = lbl1.getPreferredSize();
lbl1.setPreferredSize(new Dimension(d.width + 50, d.height));
panel_3.add(lbl1, BorderLayout.WEST);
JPanel panel_8 = new JPanel();
panel_3.add(panel_8, BorderLayout.CENTER);
textField = new JTextField();
panel_8.add(textField);
textField.setColumns(30);
JPanel panel_4 = new JPanel();
panel.add(panel_4);
panel_4.setLayout(new BorderLayout(0, 0));
JLabel lbl2 = new JLabel("Edit Customers Second Name");
lbl2.setVerticalAlignment(SwingConstants.TOP);
lbl2.getPreferredSize();
lbl2.setPreferredSize(new Dimension(d.width + 50, d.height));
panel_4.add(lbl2, BorderLayout.WEST);
JPanel panel_9 = new JPanel();
panel_4.add(panel_9, BorderLayout.CENTER);
textField_1 = new JTextField();
panel_9.add(textField_1);
textField_1.setColumns(30);
JPanel panel_5 = new JPanel();
panel.add(panel_5);
panel_5.setLayout(new BorderLayout(0, 0));
JLabel lbl3 = new JLabel("Edit Customers Address");
lbl3.setVerticalAlignment(SwingConstants.TOP);
lbl3.getPreferredSize();
lbl3.setPreferredSize(new Dimension(d.width + 50, d.height));
panel_5.add(lbl3, BorderLayout.WEST);
JPanel panel_10 = new JPanel();
panel_5.add(panel_10, BorderLayout.CENTER);
textField_2 = new JTextField();
panel_10.add(textField_2);
textField_2.setColumns(30);
JPanel panel_6 = new JPanel();
panel.add(panel_6);
panel_6.setLayout(new BorderLayout(0, 0));
JLabel lbl4 = new JLabel("Edit Customers Date of Birth");
lbl4.setVerticalAlignment(SwingConstants.TOP);
lbl4.getPreferredSize();
lbl4.setPreferredSize(new Dimension(d.width + 50, d.height));
panel_6.add(lbl4, BorderLayout.WEST);
JPanel panel_11 = new JPanel();
panel_6.add(panel_11, BorderLayout.CENTER);
textField_3 = new JTextField();
try {
mask = new MaskFormatter("##/##/####");
mask.setPlaceholderCharacter(' ');
} catch (ParseException e) {
e.printStackTrace();
}
JFormattedTextField textField_3 = new JFormattedTextField(mask);
textField_3.setText("dd/mm/yyyy");
panel_11.add(textField_3);
textField_3.setColumns(30);
JPanel panel_2 = new JPanel();
panel.add(panel_2);
panel_2.setLayout(new BorderLayout(0, 0));
JPanel panel_7 = new JPanel();
panel_2.add(panel_7, BorderLayout.CENTER);
JButton btnConfirm = new JButton("Confirm");
btnConfirm.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
panel_7.add(btnConfirm);
JButton btnCancel = new JButton("Cancel");
btnCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
panel_7.add(btnCancel);
JPanel panel_1 = new JPanel();
panel_1.setBackground(SystemColor.activeCaption);
contentPane.add(panel_1, BorderLayout.NORTH);
JLabel lblEditACurrent = new JLabel("Edit a Current Customer");
lblEditACurrent.setForeground(Color.BLACK);
lblEditACurrent.setFont(new Font("Arial", Font.PLAIN, 19));
lblEditACurrent.setBackground(UIManager.getColor("InternalFrame.activeTitleBackground"));
panel_1.add(lblEditACurrent);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
editCustomers frame = new editCustomers(new ArrayList<Customers>());
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}
You can try something like this ....
Change line 63 - 67 as following. Put the customers into the combobox instead of just names.
JComboBox<Customer> comboBox = new JComboBox<>();
//comboBox.setModel(new DefaultComboBoxModel());
for (Customers temp : customerList) {
comboBox.addItem(temp);
}
Then implement an ActionListener for the combobox as following.
comboBox.addActionListener(new ActionListener() {
#Override
public void actionPerformed(ActionEvent e) {
Customer customer = comboBox.getSelectedItem();
// Use the above customer object's fields to populate your text fields
}
});
I am trying to write a program with JPanels and for the life of me, I can't seem to get the JPanels to go into the proper positions. I don't have a clue what I am doing wrong.
Here is some of the code I have so far:
package mainGUIWindowFrames;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class CustomerWindow extends JFrame
{
//Attribute
private JTextField textTF;
private JButton copyButton;
private JLabel copyLabel;
private Border panelEdge;
//Constructor
public CustomerWindow()
{
this.setBounds(100,100,800,600);
panelEdge = BorderFactory.createEtchedBorder();
JPanel mainPanel = new JPanel(new BorderLayout(5, 5));
mainPanel.add(createCustomerPanel(), BorderLayout.NORTH);
mainPanel.add(createCustomerInfoPanel(), BorderLayout.EAST);
mainPanel.add(createSearchPanel(), BorderLayout.WEST);
}
//Operational Methods
public JPanel createCustomerPanel()
{
JPanel customerPanel = new JPanel();
JLabel customerL = new JLabel("Clients",SwingConstants.CENTER);
customerL.setForeground(Color.blue);
customerL.setFont(new Font("Copperplate Gothic Bold",Font.BOLD,48));
customerPanel.add(customerL);
customerPanel.setBorder(panelEdge);
return customerPanel;
}
public JPanel createCustomerInfoPanel()
{
JPanel infoPanel = new JPanel();
infoPanel.setBorder(panelEdge);
JLabel infoL = new JLabel("Clients",SwingConstants.CENTER);
infoL.setForeground(Color.blue);
infoL.setFont(new Font("Copperplate Gothic Bold",Font.BOLD,48));
infoPanel.add(infoL);
//add a text field
textTF = new JTextField(50);
infoPanel.add(textTF);
//add a button
copyButton = new JButton("Copy Text");
copyButton.addActionListener(new ButtonListener());
infoPanel.add(copyButton);
copyLabel = new JLabel("-----------------");
infoPanel.add(copyLabel);
return infoPanel;
}
public JPanel createSearchPanel()
{
JPanel lowerPanel = new JPanel();
JLabel label = new JLabel("Text Transferred from JList:");
//the spot where the data shows up
lowerPanel.add(label);
return lowerPanel;
}
The only Panel that shows up is the CreateCustomerPanel(). I have no idea what I need to do to get the other two panels to work.
If you could help me out that would be great!!
well I eventually wound up solving it by creating another panel and moving the panels I had out of the main constructor.
public CustomerWindow() {
panelEdge = BorderFactory.createEtchedBorder();
}
public JPanel createNorthPanel()
{
JPanel customerPanel = new JPanel();
JLabel customerL = new JLabel("Clients",SwingConstants.CENTER);
customerL.setForeground(Color.blue);
customerL.setFont(new Font("Copperplate Gothic Bold",Font.BOLD,48));
customerPanel.add(customerL);
customerPanel.setBorder(panelEdge);
return customerPanel;
}
//Operational Methods
public JPanel createCustomerPanel()
{
JPanel mainPanel = new JPanel(new BorderLayout(5, 5));
mainPanel.add(createNorthPanel(), BorderLayout.NORTH);
mainPanel.add(createCustomerInfoPanel(), BorderLayout.EAST);
mainPanel.add(createSearchPanel(), BorderLayout.WEST);
return mainPanel;
}
public JPanel createCustomerInfoPanel()
{
JPanel infoPanel = new JPanel();
Box vBox = Box.createVerticalBox();
infoPanel.setBorder(panelEdge);
JLabel infoL = new JLabel("Clients",SwingConstants.CENTER);
infoL.setForeground(Color.blue);
infoL.setFont(new Font("Copperplate Gothic Bold",Font.BOLD,48));
infoPanel.add(infoL);
//add a text field
clientId = new JTextField(10);
vBox.add(clientId);
vBox.add(Box.createVerticalStrut(25));
fName = new JTextField(10);
vBox.add(fName);
vBox.add(Box.createVerticalStrut(25));
lName = new JTextField(10);
vBox.add(lName);
vBox.add(Box.createVerticalStrut(25));
address = new JTextField(10);
vBox.add(address);
vBox.add(Box.createVerticalStrut(25));
postalCode = new JTextField(10);
vBox.add(postalCode);
vBox.add(Box.createVerticalStrut(25));
number = new JTextField(10);
vBox.add(number);
vBox.add(Box.createVerticalStrut(25));
type = new JTextField(10);
vBox.add(type);
infoPanel.add(vBox);
return infoPanel;
Ive still got a lot of work to do but thanks to all those who helped me out!!
Based on your example, nothing should show up, as you've not added mainPanel to anything.
Once I did that, I was able to get
to show up...
Modified code example
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
public class CustomerWindow extends JFrame {
//Attribute
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
#Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
CustomerWindow frame = new CustomerWindow();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
private JTextField textTF;
private JButton copyButton;
private JLabel copyLabel;
private Border panelEdge;
//Constructor
public CustomerWindow() {
this.setBounds(100, 100, 800, 600);
panelEdge = BorderFactory.createEtchedBorder();
JPanel mainPanel = new JPanel(new BorderLayout(5, 5));
mainPanel.add(createCustomerPanel(), BorderLayout.NORTH);
mainPanel.add(createCustomerInfoPanel(), BorderLayout.EAST);
mainPanel.add(createSearchPanel(), BorderLayout.WEST);
add(mainPanel);
}
//Operational Methods
public JPanel createCustomerPanel() {
JPanel customerPanel = new JPanel();
JLabel customerL = new JLabel("Clients", SwingConstants.CENTER);
customerL.setForeground(Color.blue);
customerL.setFont(new Font("Copperplate Gothic Bold", Font.BOLD, 48));
customerPanel.add(customerL);
customerPanel.setBorder(panelEdge);
return customerPanel;
}
public JPanel createCustomerInfoPanel() {
JPanel infoPanel = new JPanel();
infoPanel.setBorder(panelEdge);
JLabel infoL = new JLabel("Clients", SwingConstants.CENTER);
infoL.setForeground(Color.blue);
infoL.setFont(new Font("Copperplate Gothic Bold", Font.BOLD, 48));
infoPanel.add(infoL);
//add a text field
textTF = new JTextField(50);
infoPanel.add(textTF);
//add a button
copyButton = new JButton("Copy Text");
// copyButton.addActionListener(new ButtonListener());
infoPanel.add(copyButton);
copyLabel = new JLabel("-----------------");
infoPanel.add(copyLabel);
return infoPanel;
}
public JPanel createSearchPanel() {
JPanel lowerPanel = new JPanel();
JLabel label = new JLabel("Text Transferred from JList:");
//the spot where the data shows up
lowerPanel.add(label);
return lowerPanel;
}
}
You didn't add the mainpanel in the constructor.
add(mainPanel);
I am trying to implement a GUI in Java Swing; but I am stuck on the button size, which I am trying to make smaller. I have tried to use setSize, setPrefferedSize and setmaximumSize, but nothing worked. Any ideas?
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.*;
import javax.swing.border.Border;
public class WorkStationGUI extends JFrame implements ActionListener {
JButton Worker1Process1;
JButton Worker1Process2;
JButton StopWorking;
// JScrollPane scrollList;
JTextArea OrderList;
JTextArea ProductList;
JTextField orders;
JTextField products;
JTextField Worker1;
JTextField Worker2;
private HashMap<String, Order> OrdersList;
private HashMap<String, Product> ProductsList;
public WorkStationGUI(HashMap<String, Order> orders, HashMap<String, Product> Products) {
this.OrdersList = orders;
this.ProductsList = Products;
setTitle("Work Station");
setupEastandWest();
setupSouthPanel();
pack();
setVisible(true);
}
private JLabel createOneLabel(String s, Color c) {
Font f = new Font(Font.SANS_SERIF, Font.BOLD, 18);
JLabel label = new JLabel(s, JLabel.CENTER);
label.setFont(f);
label.setBackground(c);
label.setOpaque(true);
return label;
}
private void setupEastandWest() {
// search panel contains label, text field and button
JPanel Panel = new JPanel();
Worker1Process1 = new JButton("Worker 1");
Worker1Process1.setPreferredSize(new Dimension(10, 10));
Panel.add(Worker1Process1);
Worker1 = new JTextField(20);
Worker1Process1.setPreferredSize(new Dimension(90, 90));
Worker1.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
Worker1.setEditable(false);
Panel.setLayout(new GridLayout(2, 1));
Panel.add(Worker1);
JPanel Panel2 = new JPanel();
Worker1Process2 = new JButton("Worker 2");
Panel2.add(Worker1Process2);
Worker2 = new JTextField(20);
Worker2.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 14));
Worker2.setEditable(false);
Panel2.setLayout(new GridLayout(2, 1));
Panel2.add(Worker2);
Panel.setLayout(new GridLayout(2, 2));
this.add(Panel, BorderLayout.EAST);
this.add(Panel2, BorderLayout.WEST);
// this.add(Panel2, BorderLayout.SOUTH);
}
private void setupSouthPanel() {
JPanel Panel = new JPanel();
orders = new JTextField(1);
orders.setBackground(Color.LIGHT_GRAY);
Panel.add(orders);
JPanel Panel2 = new JPanel();
products = new JTextField(1);
Panel.add(products);
products.setBackground(Color.LIGHT_GRAY);
Panel.setLayout(new GridLayout(2, 2));
this.add(Panel, BorderLayout.CENTER);
this.add(Panel2, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
}
}
You are using GridLayout which will cause the component to take up all container space, relative to the grid. It's not really the best choice for buttons. You might try using a FlowLayout, or GridBagLayout instead.
Also, you are setting the layout manager AFTER you are setting the JButton on the panel.