I'm building a JPanel and it is given to a JInternalFrame. Now I want that if someone clicks on the X button of the JInternalFrame it is hidden, not closed. The Problem is that I have to implement this function in the JPanel and I don't have access to the JInternalFrame.
Is this possible?
I know from the JInternalFrame it can be realized with setDefaultCloseOperation(HIDE_ON_CLOSE); but I don't know how to do it from the JPanel. Of course I searched in SO but I did not found anything that fits for my case.
Another Question, just for understanding: what is happening when you click on the X button? Is the dispose() function called? I'm new to Java Swing and interested how it works.
but I don't know how to do it from the JPanel
You can use the SwingUtilities class to find the parent container.
Something like:
JInternalFrame frame = (JInternalFrame)SwingUtilities.ancestorOfClass(JInternalFrame.class, thePanel);
Related
I not able to getting the proper JinternalFrame. In my application in main JFrame I have one disktopPane that contains GridLayout.
When I call JInternalFrame by click on button I am getting that internalFrame, but that fix to a particular Grid box only, and I am not able to maximize the InternalFrame.
How can I solve the probleam?
below is my GUI:
I am doing Code through NetBeans.
How Can I fix this issue ?
Don't use a jdesktoppane. Use a normal JFrame with a JPanel with your components and the gridbaglayout.
For the windows floating above the main JFrame use new JFrame's with setAlwaysOnTop(true) and make sure they have your main JFrame as root.
I'm new to Java and actually designing the GUI for an application.
My main is a JFrame with 5 buttons and 1 panel which will have the "content", for the first button for example, I've designed a Jframe which has a JTabbedPane.
Now I would like to know how can I incorporate the content from that frame to the "content" panel when clicking on the button ?
I tried to use .add but I get:
java.lang.IllegalArgumentException: adding a window to a container
(seems we can't add Jframe to Jpanel).
I also tried the setVisible way but it doesn't meet what I need since it will hide the panel completely and I will get a tiny window with the buttons.
![Jframe content][1]
![Main Jframe with buttons and Jpanel to show the jframe content][2]
The code is generated by netbeans, and I forgot to mention that I did research on adding a Jframe into another Jframe but here isn't my problem at all.
I tried by changing the Jframe by JInternalFrame but clicking on button doesn't do anything.
Button has
contentPanel.add(new GestionUtilisateur());
So basically when you click on the "Gestion Utilisateur" button for example, you get that JTabbedPane that has to appear in the content area (which is blank here)
You should not be putting JFrames inside JPanels. If you have multiple panels you would like to display, depending on something like a button, look in to LAYOUTS.
In particular, it sounds like a CardLayout would work well for your needs. CardLayouts allow you to swap which panel is displayed in a frame by bringing it to the "front" of a list of panels. This would let you display your JTabbedPane on one button click, then click another to change the content pane.
JFrame can not be added in a JPanel.
use JInternalFrame
Make and hold references to JPanels containing your content. A JFrame is really just that, it's a frame (though you can add a single component to it).
You can't add a JFrame to a JPanel. If you want multiple components to be visible use layouts such as BorderLayout, GridBag, etc. Check out some of the Swing layout tutorials here.
Content should be designed as JPanel (you can design it with drag&drop just like JFrame) but if you really have to put a JFrame to JPanel for some reason, you can do it by
myJPanel.add(myJFrame.getContentPane());
however i would suggest modification of your program.
I have a JFrame and it has a JPanel. In my JPanel class, I have some combo-boxes, and a button. What I would like to do is dynamically switch (I suppose repaint() - am I right?) my JPanel is based on those combo-boxes and button. So simply creating two panels and making one opaque or whatever, won't work. I would really appreciate if someone provided me with some guidance. I would like to do this in the simplest way possible. I would also like all buttons/combo-boxes and whatever else to carry over into this new background.
The easiest way would be just to call setBackground(Color):
Example:
JPanel myPanel = new JPanel();
myPanel.setBackground(Color.RED);
I have Main class, StartFrame extends JFrame, and UserPanel extends JPanel which I add to StartFrame. I have button in the UserPanel, how can I close StartFrame when I press the button(I am familiar with event handling it's not a problem the issue is how to sent info to the StartFrame) . Or it is better to just change the panel of the frame(size if need) and reuse it?
If you want to close a window that is enclosing a component, you need a reference to that Window, and SwingUtilities has a method that can help you get this: getWindowAncestor(Component c). Then you could call dispose() on the window returned.
i.e.,
Window win = SwingUtilities.getWindowAncestor(myJPanel);
win.dispose();
Note that this is fine if you're using this to end your GUI, but if your goal is to swap views, then a better suggestion is not to swap Windows, but rather to leave the main JFrame visible but to instead swap components it shows with a CardLayout.
The button is already on the frame (on the upper right, here). Just call JFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) when constructing it and it will work as the user expects.
Other tip
Don't extend frame or panel, but instead just create and use them.
I want one JFrame to have a method like this:
private void someEvent(java.awt.event.ActionEvent evt){
//initialize another JFrame
//set the new JFrame to be visible
//set this JFrame to be disabled
}
Which is possible, but I also want the main JFrame to perform something when the newly created JFrame is disposed. I don't want to pass in the main JFrame to the new JFrame however. Is this possible?
Instead, use CardLayout to switch between the two desired content panes. There's an example here.
Don't have one JFrame create and display another JFrame. Instead the second window should be a JDialog, either modal if you want the first window frozen until the second has been dealt with or non-modal if otherwise. If modal then the first window's code will resume once the JDialog has been disposed of, and the code flow will start right after the setVisible(true) call on the dialog. If non-Modal, you'll likely want to add a WindowListener to the dialog.
For example, please check out my code here, here, and here.