I have been looking for multiple ways to open a JFrame with a button. One of the ways I found was to establish the JFrame with a method and call upon that method with the button. That however does not seem to be working with my program. Could someone please tell me what I am doing wrong? I am pretty new to Java and am trying to learn on my own and seem to be doing a pretty terrible job of it. I am trying to create a Catalog and at the bottom of it have a button called "Make a New Purchase" which will open a new JFrame that will allow someone to enter their information. Much of the code in the program is unnecessary and I will edit it later, such as the multiple JPanels. All I need to do is get the new JFrame to come up with the button click. The showNewFrame() method is what I am trying to have activated by the button press.
public class Catalog extends JFrame
{
//Construct a panel for each row
JPanel firstRow = new JPanel();
JPanel secondRow = new JPanel();
JPanel thirdRow = new JPanel();
JPanel fourthRow = new JPanel();
JPanel fifthRow = new JPanel();
JPanel sixthRow = new JPanel();
JPanel seventhRow = new JPanel();
JPanel eighthRow = new JPanel();
JPanel ninthRow = new JPanel();
JPanel tenthRow = new JPanel();
JPanel eleventhRow = new JPanel();
JPanel twelvethRow = new JPanel();
JPanel thirteenthRow = new JPanel();
JPanel fourteenthRow = new JPanel();
JPanel fifteenthRow = new JPanel();
JPanel sixteenthRow = new JPanel();
JPanel seventeenthRow = new JPanel();
JPanel eighteenthRow = new JPanel();
JPanel nineteenthRow = new JPanel();
JPanel twentiethRow = new JPanel();
JPanel twentyfirstRow = new JPanel();
JPanel twentysecondRow = new JPanel();
JPanel twentythirdRow = new JPanel();
JPanel twentyfourthRow = new JPanel();
//Construct a panel for the fields and buttons
JPanel fieldPanel = new JPanel();
JPanel buttonPanel = new JPanel();
//Construct labels and text boxes
JLabel coatOneLabel = new JLabel("Coat One");
ImageIcon pictureOne = new ImageIcon("C:\\Users\\p6\\Desktop\\prodImage.jpeg");
JLabel picLabelOne = new JLabel(pictureOne);
JLabel priceOneLabel = new JLabel("Price:");
JLabel coatTwoLabel = new JLabel("Coat Two");
ImageIcon pictureTwo = new ImageIcon("snow.png");
JLabel picLabelTwo = new JLabel(pictureTwo);
JLabel priceTwoLabel = new JLabel("Price:");
JLabel coatThreeLabel = new JLabel("Coat Three");
ImageIcon pictureThree = new ImageIcon("snow.png");
JLabel picLabelThree = new JLabel(pictureThree);
JLabel priceThreeLabel = new JLabel("Price:");
JLabel coatFourLabel = new JLabel("Coat Four");
ImageIcon pictureFour = new ImageIcon("snow.png");
JLabel picLabelFour = new JLabel(pictureFour);
JLabel priceFourLabel = new JLabel("Price:");
JLabel coatFiveLabel = new JLabel("Coat Five");
ImageIcon pictureFive = new ImageIcon("snow.png");
JLabel picLabelFive = new JLabel(pictureFive);
JLabel priceFiveLabel = new JLabel("Price:");
JLabel coatSixLabel = new JLabel("Coat Six");
ImageIcon pictureSix = new ImageIcon("snow.png");
JLabel picLabelSix = new JLabel(pictureSix);
JLabel priceSixLabel = new JLabel("Price:");
JLabel coatSevenLabel = new JLabel("Coat Seven");
ImageIcon pictureSeven = new ImageIcon("snow.png");
JLabel picLabelSeven = new JLabel(pictureSeven);
JLabel priceSevenLabel = new JLabel("Price:");
JLabel coatEightLabel = new JLabel("Coat Eight");
ImageIcon pictureEight = new ImageIcon("snow.png");
JLabel picLabelEight = new JLabel(pictureEight);
JLabel priceEightLabel = new JLabel("Price:");
//Construct buttons
JButton submitButton = new JButton("Make A Purchase");
JButton exitButton = new JButton("Not Right Now");
public static void main(String[] args)
{
//set the look and feel of the interface
try
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,"The UIManager could not set the Look and Feel for this application.","Error",JOptionPane.INFORMATION_MESSAGE);
}
Catalog f = new Catalog();
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f.setSize(800,600);
f.setTitle("Coat Catalog");
f.setResizable(false);
f.setLocation(200,200);
f.setVisible(true);
}
public Catalog()
{
Container c = getContentPane();
c.setLayout((new BorderLayout()));
fieldPanel.setLayout(new GridLayout(20,10));
FlowLayout rowSetup = new FlowLayout(FlowLayout.LEFT,5,3);
firstRow.setLayout(rowSetup);
secondRow.setLayout(rowSetup);
thirdRow.setLayout(rowSetup);
fourthRow.setLayout(rowSetup);
fifthRow.setLayout(rowSetup);
sixthRow.setLayout(rowSetup);
seventhRow.setLayout(rowSetup);
eighthRow.setLayout(rowSetup);
ninthRow.setLayout(rowSetup);
tenthRow.setLayout(rowSetup);
eleventhRow.setLayout(rowSetup);
twelvethRow.setLayout(rowSetup);
thirteenthRow.setLayout(rowSetup);
fourteenthRow.setLayout(rowSetup);
fifteenthRow.setLayout(rowSetup);
sixteenthRow.setLayout(rowSetup);
seventeenthRow.setLayout(rowSetup);
eighteenthRow.setLayout(rowSetup);
nineteenthRow.setLayout(rowSetup);
twentiethRow.setLayout(rowSetup);
twentyfirstRow.setLayout(rowSetup);
twentysecondRow.setLayout(rowSetup);
twentythirdRow.setLayout(rowSetup);
twentyfourthRow.setLayout(rowSetup);
buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
//Add fields to rows
firstRow.add(coatOneLabel);
firstRow.add(coatTwoLabel);
secondRow.add(picLabelOne);
secondRow.add(picLabelTwo);
thirdRow.add(priceOneLabel);
thirdRow.add(priceTwoLabel);
fourthRow.add(coatThreeLabel);
fourthRow.add(coatFourLabel);
fifthRow.add(picLabelThree);
fifthRow.add(picLabelFour);
sixthRow.add(priceThreeLabel);
sixthRow.add(priceFourLabel);
seventhRow.add(coatFiveLabel);
seventhRow.add(coatSixLabel);
eighthRow.add(picLabelFive);
eighthRow.add(picLabelSix);
ninthRow.add(priceFiveLabel);
ninthRow.add(priceSixLabel);
tenthRow.add(coatSevenLabel);
tenthRow.add(coatEightLabel);
eleventhRow.add(picLabelSeven);
eleventhRow.add(picLabelEight);
twelvethRow.add(priceSevenLabel);
twelvethRow.add(priceEightLabel);
//Add rows to panel
fieldPanel.add(firstRow);
fieldPanel.add(secondRow);
fieldPanel.add(thirdRow);
fieldPanel.add(fourthRow);
fieldPanel.add(fifthRow);
fieldPanel.add(sixthRow);
fieldPanel.add(seventhRow);
fieldPanel.add(eighthRow);
fieldPanel.add(ninthRow);
fieldPanel.add(tenthRow);
fieldPanel.add(eleventhRow);
fieldPanel.add(twelvethRow);
fieldPanel.add(thirteenthRow);
fieldPanel.add(fourteenthRow);
fieldPanel.add(fifteenthRow);
fieldPanel.add(sixteenthRow);
fieldPanel.add(seventeenthRow);
fieldPanel.add(eighteenthRow);
fieldPanel.add(nineteenthRow);
fieldPanel.add(twentiethRow);
fieldPanel.add(twentyfirstRow);
fieldPanel.add(twentysecondRow);
fieldPanel.add(twentythirdRow);
fieldPanel.add(twentyfourthRow);
//Add button to panel
buttonPanel.add(submitButton);
buttonPanel.add(exitButton);
//Add panels to frame
c.add(fieldPanel, BorderLayout.CENTER);
c.add(buttonPanel, BorderLayout.SOUTH);
exitButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent h)
{
if (h.getSource() == exitButton)
{
System.exit(0);
}
}
});
//Add functionality to buttons
submitButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent d)
{
if (d.getSource() == submitButton)
{
showNewFrame();
}
}
});
}
private void showNewFrame()
{
JFrame BillPayer = new JFrame("BillPayer");
BillPayer.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
BillPayer.pack();
BillPayer.setVisible(true);
class BillPayer extends JFrame implements ActionListener
{
//Declare output stream
DataOutputStream output;
//Construct a panel for each row
JPanel firstRow = new JPanel();
JPanel secondRow = new JPanel();
JPanel thirdRow = new JPanel();
JPanel fourthRow = new JPanel();
JPanel fifthRow = new JPanel();
JPanel sixthRow = new JPanel();
JPanel seventhRow = new JPanel();
JPanel eighthRow = new JPanel();
//Construct a panel for the fields and buttons
JPanel fieldPanel = new JPanel();
JPanel buttonPanel = new JPanel();
//Construct labels and text boxes
JLabel acctNumLabel = new JLabel("Account Number: ");
JTextField acctNum = new JTextField(15);
JLabel pmtLabel = new JLabel("Payment Amount:");
JTextField pmt = new JTextField(10);
JLabel firstNameLabel = new JLabel("First Name: ");
JTextField firstName = new JTextField(10);
JLabel lastNameLabel = new JLabel("Last Name:");
JTextField lastName = new JTextField(20);
JLabel addressLabel = new JLabel("Address:");
JTextField address = new JTextField(35);
JLabel cityLabel = new JLabel("City: ");
JTextField city = new JTextField(10);
JLabel stateLabel = new JLabel("State:");
JTextField state = new JTextField(2);
JLabel zipLabel = new JLabel("Zip:");
JTextField zip = new JTextField(9);
//Construct button
JButton submitButton = new JButton("Submit");
public void main(String[] args)
{
//set the look and feel of the interface
try
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null,"The UIManager could not set the Look and Feel for this application.","Error",JOptionPane.INFORMATION_MESSAGE);
}
BillPayer f = new BillPayer();
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f.setSize(450,300);
f.setTitle("Crandall Power and Light Customer Payments");
f.setResizable(false);
f.setLocation(200,200);
f.setVisible(true);
}
public BillPayer()
{
Container c = getContentPane();
c.setLayout((new BorderLayout()));
fieldPanel.setLayout(new GridLayout(8,1));
FlowLayout rowSetup = new FlowLayout(FlowLayout.LEFT,5,3);
firstRow.setLayout(rowSetup);
secondRow.setLayout(rowSetup);
thirdRow.setLayout(rowSetup);
fourthRow.setLayout(rowSetup);
fifthRow.setLayout(rowSetup);
sixthRow.setLayout(rowSetup);
seventhRow.setLayout(rowSetup);
eighthRow.setLayout(rowSetup);
buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
//Add fields to rows
firstRow.add(acctNumLabel);
firstRow.add(pmtLabel);
secondRow.add(acctNum);
secondRow.add(pmt);
thirdRow.add(firstNameLabel);
thirdRow.add(lastNameLabel);
fourthRow.add(firstName);
fourthRow.add(lastName);
fifthRow.add(addressLabel);
sixthRow.add(address);
seventhRow.add(cityLabel);
seventhRow.add(stateLabel);
seventhRow.add(zipLabel);
eighthRow.add(city);
eighthRow.add(state);
eighthRow.add(zip);
//Add rows to panel
fieldPanel.add(firstRow);
fieldPanel.add(secondRow);
fieldPanel.add(thirdRow);
fieldPanel.add(fourthRow);
fieldPanel.add(fifthRow);
fieldPanel.add(sixthRow);
fieldPanel.add(seventhRow);
fieldPanel.add(eighthRow);
//Add button to panel
buttonPanel.add(submitButton);
//Add panels to frame
c.add(fieldPanel, BorderLayout.CENTER);
c.add(buttonPanel, BorderLayout.SOUTH);
//Add functionality to buttons
submitButton.addActionListener(this);
//Get the current date and open the file
Date today = new Date();
SimpleDateFormat myFormat = new SimpleDateFormat("MMddyyyy");
String filename = "payments" + myFormat.format(today);
try
{
output = new DataOutputStream(new FileOutputStream(filename));
}
catch(IOException io)
{
JOptionPane.showMessageDialog(null,"The program could not create a storage location. Please check the disk drive and then run the program again.","Error",JOptionPane.INFORMATION_MESSAGE);
System.exit(1);
}
addWindowListener(
new WindowAdapter()
{
public void windowClosing(WindowEvent f)
{
int answer = JOptionPane.showConfirmDialog(null,"Are you sure you want to exit and submit the file?", "File Submission",JOptionPane.YES_NO_OPTION);
if (answer == JOptionPane.YES_OPTION)
System.exit(0);
}
}
);
}
public void actionPerformed(ActionEvent f)
{
String arg = f.getActionCommand();
if(checkFields())
{
try
{
output.writeUTF(acctNum.getText());
output.writeUTF(pmt.getText());
output.writeUTF(firstName.getText());
output.writeUTF(lastName.getText());
output.writeUTF(address.getText());
output.writeUTF(city.getText());
output.writeUTF(state.getText());
output.writeUTF(zip.getText());
JOptionPane.showMessageDialog(null,"The payment information has been saved.","Submission successful",JOptionPane.INFORMATION_MESSAGE);
}
catch(IOException c)
{
System.exit(1);
}
clearFields();
}
}
public boolean checkFields()
{
if ((acctNum.getText().compareTo("")<1) ||
(pmt.getText().compareTo("")<1) ||
(firstName.getText().compareTo("")<1) ||
(lastName.getText().compareTo("")<1) ||
(address.getText().compareTo("")<1) ||
(city.getText().compareTo("")<1) ||
(state.getText().compareTo("")<1) ||
(zip.getText().compareTo("")<1))
{
JOptionPane.showMessageDialog(null,"You must complete all fields.","Data Entry Error",JOptionPane.WARNING_MESSAGE);
return false;
}
else
{
return true;
}
}
public void clearFields()
{
//Clear fields and reset the focus
acctNum.setText("");
pmt.setText("");
firstName.setText("");
lastName.setText("");
address.setText("");
city.setText("");
state.setText("");
zip.setText("");
acctNum.requestFocus();
}
}
}
}
I tried to make quite a few changes to the program. The issue is that now the button does bring up a new window but the window doesn't include the data I need it to have. It has the title "Coat Payment", so I believe it is getting to everything but the inner class I have in the BillPayer method (the inner class is PaymentScreen). Once again I believe that my ignorance is leading me astray.
//Add functionality to buttons
submitButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent d)
{
if (d.getSource() == submitButton)
{
BillPayer();
}
}
});
}
private void BillPayer()
{
JDialog PaymentScreen = new JDialog();
PaymentScreen.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
PaymentScreen.setSize(900,600);
PaymentScreen.setTitle("Coat Payment");
PaymentScreen.setResizable(false);
PaymentScreen.setLocation(200,200);
PaymentScreen.setVisible(true);
class PaymentScreen extends JDialog implements ActionListener
{
Sorry, but that's some schizophrenic code. Maybe I'm reading it wrong, but I see:
You create a JFrame variable called BillPayer, and set it visible. It is a small empty JFrame and nothing else.
You then declare a separate BillPayer class, and don't display it,
Except for in code within its (???) main method, a main method that is within a private inner class, which is (appropriately) never called.
Recommendations:
First and foremost, you probably really don't want to display another JFrame. Most applications should have only one main window, a JFrame.
If you need another window being displayed from a main window, then use a dialog such as a JDialog. This is fairly easy to do, and just like a JFrame involves creating a JPanel filled with your GUI, and then placing that JPanel into the JDialog and setting it visible.
If you use a JDialog, you can choose whether it is modal or not, whether it will freeze the underlying calling window when it is displayed or not.
To display another window from a button press, be it a JFrame or a JDialog, you would call setVisible(true) on the window from within the button press's ActionListener actionPerformed method. It looks like you're doing this. Is anything showing at all? Have you debugged the code to see if code you think is being reached is not being called?
Or if you want to display another view inside of the main window, use a CardLayout.
Don't give your variables the exact same name, spelling and capitalization as your classes.
Learn and follow Java naming conventions: class names begin with an upper case letter and variable and method names with lower-case letters.
Don't confuse your code by burying a main method inside of an inner private class. This makes little sense.
Study up on use of arrays and collections such as ArrayLists which can help you make programs that are much more compact, more readable, and easier to debug and extend. A lot of your code's redundancy can be reduced by doing this.
If you have code for another GUI view that is distinct from the main view, perhaps this code should be in its own top-level class, and not an inner class.
Edit
On review of your code some more, I suggest:
Yes, use a JDialog for the data entry window.
The data would probably be best displayed in a JTable held in a JScrollPane in the main GUI. This would be in place of the rows of JPanels that your current code uses.
This is going to sound rough, but it's more time efficient.
Select project > hit delete
Download Netbeans or Eclipse (or both) and program in these programs. They will help filter out mistakes you've made and provide a help with layout, so that it looks more comprehensible.
Once that's done, follow these tutorials:
http://docs.oracle.com/javase/tutorial/uiswing/start/index.html
The answer above already gave a lot of valuable tips, but your problem is that you simply do not know anything yet on how to properly build a program.
My tip: decide for yourself what would be awesome to make. Something you think is useful for yourself or others, then go through the tutorial and try to build it. This forces you to not only implement what you learn as you go along, but also run into the real issue with any programmming language: learn how to solve problems.
Related
I was wondering if it was possible to add dropdown menus to a main JPanel from a different class instead of calling it from that class itself. Mainly because a friend and I are working on a personal project trying to create different programs in different tabs.
Here's our main GUI:
public class GUI extends JFrame {
public GUI() {
setTitle("Andy and Jack's favorite programs");
JTabbedPane jtp = new JTabbedPane();
getContentPane().add(jtp);
JPanel jp1 = new JPanel();
JLabel label1 = new JLabel();
JPanel jp2 = new JPanel();
JLabel label2 = new JLabel();
jp1.add(label1);
jtp.addTab("Andy - Encryption Program");
jp2.add(label2);
jtp.addTab("Andy - Hello World Program");
}
public static void main(String[] args) {
GUI tp = new GUI();
tp.setVisible(true);
tp.setMinimumSize(new Dimension(400, 400));
}
Here's one of our tabs:
public class encryptionPrograms extends GUI {
String[] options = new String[] { "XOR", "RSA" };
ComboBox optionsList = new JComboBox(options);
jp1.add(optionsList, BorderLayout.CENTER);
}
I'm not sure if I'm doing it correctly or not. Just got into Java and we've have been playing around with the GUI buttons and such.
There is a lot of "wrong" here and without you saying what your intention is with adding a comboBox to your jPanel it's hard to tell you the right way to do it but yes it can be done.
But first of: Always declare your variables before you initialize them so that you can access them for other methods in the class:
public class GUI extends JFrame{
private JPanel jp1,jp2;
private JLabel label1,label2;
private JTabbedPane jtp;
public GUI() {
setTitle("Andy and Jack's favorite programs");
jtp = new JTabbedPane();
jp1 = new JPanel();
label1 = new JLabel();
jp2 = new JPanel();
label2 = new JLabel();
jp1.add(label1);
jtp.addTab("Andy - Encryption Program", jp1);
jp2.add(label2);
jtp.addTab("Andy - Hello World Program",jp2);
getContentPane().add(jtp);
}
If you need to access a variable from another class you can write a get method for it.
For example:
public JPanel getMainJPanel(){
return jp1;
}
Now you can call the getMainJPanel() from another class in order to, for instance, add components to it. Just remember to .revalidate() and .repaint() the main frame after adding more components.
I think it is just late and my brain stopped working, I have been staring at this for a good hour now and can't seem to figure out my mistake. My program in a nutshell will display all of the states voting districts with a radiobutton for each party underneath it (Dem,Rep,Ind) after clicking a button for each state, it will then log a counter for each and return a winner when a party reaches 270 votes.
I am attempting to use a cardLayout to display state name and the buttons as a single component, then I plan to use GridLayout to display all of the states on one frame, but im getting ahead of myself.
Right now my issue lies in the line JPanel cards = new JPanel(new CardLayout()); and the error is telling me the constructor is undefined. I have attempted googling the error with not a lot of clear information as to how to fix it.
public class ElectoralCollegeGUI extends JFrame
{
private static final long serialVersionUID = 1L;
public ElectoralCollegeGUI()
{
super("Cast Your Votes");
//JFrame frame = new JFrame();
//setLayout(new GridLayout(14, ))
JPanel mainPanel = new JPanel();
setLayout(new FlowLayout());
JPanel buttonPanel = new JPanel();
JPanel stateNames = new JPanel();
JRadioButton Democrat,Republican,Independent ;
ButtonGroup party;
party = new ButtonGroup();
Democrat = new JRadioButton("Democrat");
Republican = new JRadioButton("Republican");
Independent = new JRadioButton("Independent");
add(buttonPanel,BorderLayout.CENTER);
//adds buttons to party button group
party.add(Democrat);
party.add(Republican);
party.add(Independent);
//adds buttons to button panel
buttonPanel.add(Democrat);
buttonPanel.add(Republican);
buttonPanel.add(Independent);
class CardLayout implements ItemListener
{
public void addComponentToPane(Container pane)
{
JLabel[] state = {new JLabel("Alabama"), new JLabel("Alaska"), new JLabel("Arizona"), new JLabel("Arkansas"), new JLabel("California"),
new JLabel("Colorado"), new JLabel("Connecticut"), new JLabel("Delaware"), new JLabel("Florida"), new JLabel("Georgia"),
new JLabel("Hawaii"), new JLabel("Idaho"), new JLabel("Illinois"), new JLabel("Indiana"), new JLabel("Iowa"), new JLabel("Kansas"),
new JLabel("Kentucky"), new JLabel("Louisiana"), new JLabel("Maine 1st"), new JLabel("Maine 2nd"), new JLabel("Maine Popular"),
new JLabel("Maryland"), new JLabel("Massachusetts"), new JLabel("Michigan"), new JLabel("Minnesota"), new JLabel("Mississippi"),
new JLabel("Missouri"), new JLabel("Montant"), new JLabel("Nebraska 1st"), new JLabel("Nebraska 2nd"), new JLabel("Nebraska 3rd"),
new JLabel("Nebraska Popular"), new JLabel("Nevada"), new JLabel("New Hampshire"), new JLabel("New Jersey"), new JLabel("New Mexico"),
new JLabel("New York"), new JLabel("North Carolina"), new JLabel("North Dakota"), new JLabel("Ohio"), new JLabel("Oklahoma"),
new JLabel("Oregon"), new JLabel("Pennsylvania"), new JLabel("Rhode Island"), new JLabel("South Carolina"), new JLabel("South Dakota"),
new JLabel("Tennessee"), new JLabel("Texas"),new JLabel("Utah"),new JLabel("Vermont"),new JLabel("Virginia"),new JLabel("Washington"),
new JLabel("West Virginia"),new JLabel("Wisconsin"),new JLabel("Wyoming"),new JLabel("Washington,D.C."),};
for (int i = 0; i < state.length ; i++)
{
stateNames.add(state[i]); //stateNames is a JPanel already
}
for( int j = 0; j<state.length; j++)
{
stateNames.setText(stateNames.getText(state[j]));
}
//Create the "cards".
JPanel buttonsCard = new JPanel();
buttonsCard.add(new JRadioButton("Democrat"));
buttonsCard.add(new JRadioButton("Republican"));
buttonsCard.add(new JRadioButton("Indepdent"));
//JPanel card2 = new JPanel();
//Create the panel that contains the "cards".
JPanel cards = new JPanel(new CardLayout());
pane.add(stateNames, BorderLayout.PAGE_START);
pane.add(cards, BorderLayout.CENTER);
}
public void itemStateChanged(ItemEvent evt) {
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, (String)evt.getItem());
}
You have a custom class CardLayout, and that is used in the line JPanel cards = new JPanel(new CardLayout()); instead of the standard class CardLayout as intended. Either rename your class (this would certainly be the simplest and least confusing), or use the full name java.awt.CardLayout where needed.
I am very new to Java and I'm trying to put together a simple time calculator.
How come the add() method only throws up the last thing I added? When I run the program it only shows "Days" instead of the textboxes and the years label.
import javax.swing.*;
public class TimeCalculator extends JFrame
{
public static void main(String[] args)
{
JOptionPaneMultiInput window = new JOptionPaneMultiInput();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(300,500);
window.setVisible(true);
}
public TimeCalculator()
{
super("Time Calculator");
JTextField yearsField = new JTextField(5);
JTextField daysField = new JTextField(5);
JTextField hoursField = new JTextField(5);
JTextField minutesField = new JTextField(5);
JTextField secondsField = new JTextField(5);
JLabel yearsLabel = new JLabel();
JLabel daysLabel = new JLabel();
JLabel hoursLabel = new JLabel();
JLabel minutesLabel = new JLabel();
JLabel secondsLabel = new JLabel();
JCheckBox yearsCheckbox = new JCheckBox();
JCheckBox daysCheckbox = new JCheckBox();
JCheckBox hoursCheckbox = new JCheckBox();
JCheckBox minutesCheckbox = new JCheckBox();
JCheckBox secondsCheckbox = new JCheckBox();
JLabel yearsCLabel = new JLabel();
JLabel daysCLabel = new JLabel();
JLabel hoursCLabel = new JLabel();
JLabel minutesCLabel = new JLabel();
JLabel secondsCLabel = new JLabel();
JButton convertButton = new JButton();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
yearsLabel.setText("Years");
daysLabel.setText("Days");
hoursLabel.setText("Hours");
minutesLabel.setText("Minutes");
secondsLabel.setText("Seconds");
yearsCLabel.setText("Yr");
daysCLabel.setText("D");
hoursCLabel.setText("Hr");
minutesCLabel.setText("Min");
secondsCLabel.setText("Sec");
convertButton.setText("Convert");
convertButton.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
//doConvert(evt); this will be added later once i figure everything out
}
});
add(yearsField);
add(yearsLabel);
add(daysField);
add(daysLabel);
}
}
JOptionPaneMultiInput mentioned in main() is not part of the posted source code. Consider posting an SSCCE.
The answer to:
When I run the program it only shows "Days" instead of the textboxes
and the years label.
TimeCalculator that appears in the question extends JFrame. By default JFrame uses BorderLayout layout. When BorderLayout is used, add() method without constraints argument results in BorderLayout.CENTER constraint to add components. So you add your objects to the center of BorderLayout. Every subsequent add() replaces the previous component that was added. At the end, only daysLabel remains.
See How to Use BorderLayout for more details. Also see A Visual Guide to Layout Managers for other layout managers as you have many controls in your frame and it would be hard to lay it out without additional nesting panels.
I'm working with GUI in Java and I've made several JDialogs opening one above the other.
I tried to create a JTabbedPane and I have succeed. However, I have to make the JTabbedPane in a JFrame. I've tried but the JPanel opens all blank.
Second of all when I use JFrame (so the new JTabbedPane became operational) that same frame appears behind the previous one.
So my questions are:
How can I create the tabbed pane in a JDialog ?
How do I make the JTabbedPane appear in front of all other frames, if I use JFrame ?
Here's my code, this JFrame opened when I click on a JButton from a previous JDialog
public class AddComponents extends JDialog {
private String[] arr = {"House", "Microgrid", "CSP", "VPP"};
public AddComponents(JDialog pai, String titulo)
{
super(pai, titulo);
frame = new JFrame(titulo);
// Display the window.
frame.setSize(500, 300);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// set grid layout for the frame
frame.getContentPane().setLayout(new GridLayout(1, 1));
tabbedPane = new JTabbedPane(JTabbedPane.TOP);
pack();
for (int i = 0; i < arr.length; i++) {
String tmp = arr[i];
tabbedPane.addTab(tmp, makePanel(tmp));
}
frame.getContentPane().add(tabbedPane);
frame.setMinimumSize(new Dimension(getWidth(), getHeight()));
frame.setLocation(pai.getX() + 85, pai.getY() + 25);
frame.setEnabled(true);
}
private JPanel makePanel(String text) {
JPanel p = new JPanel();
//p.setLayout(new GridLayout(0,1));
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
if(text.equals("House"))
{ //CADA UM DOS ifs chama a class correspondente para criar o interface
p1.setLayout(new GridLayout(4, 2));
idLabel = new JLabel("Component ID:");
idText = new JTextField("");
p1.add(idLabel);
p1.add(idText);
maxUsageLabel = new JLabel("Max usage per hour:");
maxUsageText = new JTextField("");
p1.add(maxUsageLabel);
p1.add(maxUsageText);
minUsageLabel = new JLabel("Min usage per hour:");
minUsageText = new JTextField("");
p1.add(minUsageLabel);
p1.add(minUsageText);
averageUsageLabel = new JLabel("Average usage per hour:");
averageUsageText = new JTextField("");
p1.add(averageUsageLabel);
p1.add(averageUsageText);
// emptyLabel = new JLabel("");
saveButton = new JButton("Save");
// p.add(emptyLabel);
p2.add(saveButton);
p.add(p1);
p.add(p2);
}
if(text.equals("Microgrid"))
{
p.setLayout(new GridLayout(5, 2));
outroLabel = new JLabel(" Microgrid");
p.add(outroLabel);
}
if(text.equals("VPP"))
{
p.setLayout(new GridLayout(5, 2));
outroLabel = new JLabel(" VPP");
p.add(outroLabel);
}
if(text.equals("CSP"))
{
p.setLayout(new GridLayout(5, 2));
outroLabel = new JLabel(" CSP");
p.add(outroLabel);
}
return p;
}
}
"How can I create the tabbed pane in a JDialog ?"
same as you would if you added it to a JFrame. There is essentially no difference here whatsoever.
"How do I make the JTabbedPane appear in front of all other frames, if I use JFrame ?"
you don't. You use a JDialog if you want to display a window above other windows.
For creating the JDialog use:
final JDialog dialog = new JDialog();
dialog.add(tabbedPane);
dialog.setVisible(true);
Java applications normally have only one JFrame, so nobody worries about the Z-order. If you like them, you can use JInternalFrame. Here is the tutorial. You can, however, use dialogs instead.
I have problem with setting JPanel and JFrame color to white, though I used panel.setBackground(Color.white). The second problem is that setting ImageIcon in JRadioButton constructor causes that JRadioButton is invisible. Here is my code:
public class proby {
static JPanel panel = new JPanel();
static JPanel panel2 = new JPanel();
private void createAndShowGUI() {
final ImageIcon zielonaikona = new ImageIcon("green2.png");
final ImageIcon czerwonaikona = new ImageIcon("red2.png");
final ImageIcon niebieskaikona = new ImageIcon("blue.png");
final ImageIcon szaraikona = new ImageIcon("grey.png");
JFrame frame1 = new JFrame("MasterMind");
final JRadioButton zielony = new JRadioButton(zielonaikona);
zielony.setBackground(Color.WHITE);
final JRadioButton czerwony = new JRadioButton("czerwony");
czerwony.setBackground(Color.white);
final JRadioButton niebieski = new JRadioButton("niebieski");
niebieski.setBackground(Color.white);
final JRadioButton szary = new JRadioButton("szary");
szary.setBackground(Color.white);
zielony.setSelected(true);
ButtonGroup gruparadio = new ButtonGroup();
gruparadio.add(zielony);
gruparadio.add(czerwony);
gruparadio.add(niebieski);
gruparadio.add(szary);
frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton akceptuj = new JButton("Akceptuj");
akceptuj.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JLabel label2;
if (zielony.isSelected()) {
label2 = new JLabel(zielonaikona);
} else if (czerwony.isSelected()) {
label2 = new JLabel(czerwonaikona);
} else if (szary.isSelected()) {
label2 = new JLabel(szaraikona);
} else {
label2 = new JLabel(niebieskaikona);
}
panel2.add(label2);
panel2.revalidate();
}
});
BoxLayout layout = new BoxLayout(panel, BoxLayout.Y_AXIS);
BoxLayout layout2 = new BoxLayout(panel2, BoxLayout.Y_AXIS);
panel.setLayout(layout);
panel2.setLayout(layout2);
panel.add(zielony);
panel.add(czerwony);
panel.add(niebieski);
panel.add(szary);
panel.add(akceptuj);
panel.setBackground(Color.WHITE);
panel2.setBackground(Color.white);
frame1.getContentPane().add(panel);
frame1.getContentPane().add(panel2);
BoxLayout layout3 = new BoxLayout(frame1.getContentPane(), BoxLayout.Y_AXIS);
frame1.setLayout(layout3);
frame1.setBackground(Color.white);
frame1.setSize(300, 300);
frame1.setVisible(true);
}
public static void main(String[] args) {
proby kk = new proby();
kk.createAndShowGUI();
}
}
If you want to set your JFrame background color to white, you have to get the ContentPane and set that to white:
frame1.getContentPane().setBackground(Color.white);
Take a look at JFrame.setBackground() not working — why?
As for the ImageIcon problem, it's probably because you don't have the image file at the path you indicated. (Which in your case is just inside the project folder).
Edit:
Now that I know what you're trying to do with the ImageIcon, I came up with this after seeing Andrew Thompson's trick
String imageText = "<html><img src=\""+this.getClass().getResource("green2.png")
.toString()+"\"></img></html>";
JRadioButton zielony = new JRadioButton(imageText);
However, it does involve you placing the images inside the src folder, not the project one.
There is only image visible without JRadioButton's hole.
The appearance is controlled by the Look & Feel dependent UI delegate, a subclass of ButtonUI. Short of writing your own replacement, you can use ColorIcon, seen here, to render the button as you like—with or without the hole. You can then update the icon using setIcon(), shown here.
Icon czerwonaikona = new ColorIcon(SIZE, Color.red);
JRadioButton czerwony = new JRadioButton("czerwony", czerwonaikona);