How do I change JPanel inside a JFrame on the fly?
Your use case, seems perfect for CardLayout.
In card layout you can add multiple panels in the same place, but then show or hide, one panel at a time.
How to switch JPanels in a JFrame from within the panel?
Like so :
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class CardLayoutDemo extends JFrame {
public final String YELLOW_PAGE = "yellow page";
public final String RED_PAGE = "red page";
private final CardLayout cLayout;
private final JPanel mainPane;
boolean isRedPaneVisible;
public CardLayoutDemo(){
setTitle("Card Layout Demo");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
mainPane = new JPanel();
mainPane.setPreferredSize(new Dimension(250,150));
cLayout = new CardLayout();
mainPane.setLayout(cLayout);
JPanel yellowPane = new JPanel();
yellowPane.setBackground(Color.YELLOW);
JPanel redPane = new JPanel();
redPane.setBackground(Color.RED);
mainPane.add(YELLOW_PAGE, yellowPane);
mainPane.add(RED_PAGE, redPane);
showRedPane();
JButton button = new JButton("Switch Panes");
button.addActionListener(e -> switchPanes() );
setLayout(new BorderLayout());
add(mainPane,BorderLayout.CENTER);
add(button,BorderLayout.SOUTH);
pack();
setVisible(true);
}
void switchPanes() {
if (isRedPaneVisible) {showYelloPane();}
else { showRedPane();}
}
void showRedPane() {
cLayout.show(mainPane, RED_PAGE);
isRedPaneVisible = true;
}
void showYelloPane() {
cLayout.show(mainPane, YELLOW_PAGE);
isRedPaneVisible = false;
}
public static void main(String[] args) {
new CardLayoutDemo();
}
}
Resizing a JPanel inside a JFrame
You can't resize the JComponent
because you've select CardLayout
. The CardLayout
can holds/manages one or more components that share the same display space.
What you need to read documentation and good tutorials.
Replacing JPanel with JPanel in a JFrame
Use a CardLayout, as shown here.
How to swap JPanel's from an action in a JPanel
CardLayout
is the right tool for the job.
You can simply create the ActionListener
used to swap pages in JFrame
class, and pass a reference of it to FirstPage
:
import java.awt.CardLayout;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MainFrame extends JFrame {
public MainFrame(){
setTitle("Swing Application");
setSize(1200, 800);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLocationByPlatform(true);
//Create card layout and set it to the content pane
CardLayout cLayout = new CardLayout();
setLayout(cLayout);
//create and add second page to the content pane
JPanel secondPage = new SecondPage();
add("SECOND",secondPage);
//create an action listener to swap pages
ActionListener listener = actionEvent ->{
cLayout.show(getContentPane(), "SECOND");
};
//use the action listener in FirstPage
JPanel firstPage = new FirstPage(listener);
add("FIRST", firstPage);
cLayout.show(getContentPane(), "FIRST");
setVisible(true);
}
public static void main(String[] args) {
new MainFrame();
}
}
class FirstPage extends JPanel {
public FirstPage(ActionListener listener) {
JButton clickBtn = new JButton("Click");
clickBtn.addActionListener(listener);
add(clickBtn);
}
}
class SecondPage extends JPanel {
public SecondPage() {
add(new JLabel("Welcome to the Second Page"));
}
}
switching jpanels with menuItem inside Jframe
there are two ways
remove (
JFrame.getContentPane.removeAll()
) and addJPanel
toJFrame
, required to callJFrame.(re)validate
andJFrame.repaint
after all changes to already visible Swing GUI is done, once time, last code lines(better, correct, proper of ways) use CardLayout, code example in official Oracle tutorial, a few good, some excelent examples here
Updating JPanel content in JFrame by using a frame state variable
The problem is that initialize is only being called once, at object creation, and it should only be called once, and because of this the setVisible(...)
code is not being called from the ActionListeners. Instead you need to put the mechanisms for changing the views within the ActionListeners themselves, not just changing state, not unless you are using a "bound property" and PropertyChangeListeners.
Myself, I'd recommend using a CardLayout to assist you in your swapping, and rather than directly changing Strings, call a public method of your class -- planning for when and if the ActionListener (controller) code is ever removed from the view class.
Also, regarding:
btnPage.setVisible(window == "page" ? false : true);
don't compare Strings using ==
or !=
. Use the equals(...)
or the equalsIgnoreCase(...)
method instead. Understand that ==
checks if the two object references are the same which is not what you're interested in. The methods on the other hand check if the two Strings have the same characters in the same order, and that's what matters here.
Also, if all you want to do is change the text and behavior that a JButton is doing, then you can change this easily by using setText(...)
to change only the text, and for a deeper change, call setAction(Action action)
to change text and state.
Related Topics
How to Run Certain Task Every Day at a Particular Time Using Scheduledexecutorservice
Mod in Java Produces Negative Numbers
What's the Syntax for Mod in Java
Creating a Variable Name Using a String Value
How to Handle Windows File Upload Using Selenium Webdriver
Java Datetimeformatterbuilder Fails on Testtime
How to Decompile a Whole Jar File
Generate All Combinations from Multiple Lists
Why Does JPA Have a @Transient Annotation
Java Count Occurrence of Each Item in an Array
Hibernate Criteria Returns Children Multiple Times with Fetchtype.Eager
Java Method to Swap Primitives
How to Convert Int[] to Integer[] in Java
Jersey /* Servlet Mapping Causes 404 Error for Static Resources
Getheight Returns 0 for All Android UI Objects
How to Resolve Host "<Url Here>" No Address Associated with Host Name