Java JPanel moves slightly on its own + extra
"the problem is when I push button "reset" I delete iconPanel and add it again it moves slightly to right on its own."
The reason this happens is because a JPanel
has a FlowLayout
by default. You're trying add to a BorderLayout
position that is non-existent.
this.add(iconPanel, BorderLayout.SOUTH);
The FlowLayout
has default gaps on the edges, so when you set the size of the frame, those gaps aren't respected. To over come this, it is also preferable to pack()
the frame, instead of setSize()
The reason BorderLayout
works (doesn't shift) is because preferred sizes aren't respected.
If you set the layout in the constructor to this.setLayout(new BorderLayout());
You won't have the shift.
public MainScreen() {
JPanel mainPanel = new JPanel(new BorderLayout());
this.setLayout(new BorderLayout()); <----
setBtnPanelAndComp();
setIconPanelAndComp();
add(mainPanel);
}
Notes
- You should
setVisible()
after adding components. That's why your frame jumps when you first open it. You are setting the frame visible, then moving it around with the location, and adding components.
The Use of Multiple JFrames: Good or Bad Practice?
I'm just wondering whether it is good practice to use multiple JFrames?
Bad (bad, bad) practice.
- User unfriendly: The user sees multiple icons in their task bar when expecting to see only one. Plus the side effects of the coding problems..
- A nightmare to code and maintain:
- A modal dialog offers the easy opportunity to focus attention on the content of that dialog - choose/fix/cancel this, then proceed. Multiple frames do not.
- A dialog (or floating tool-bar) with a parent will come to front when the parent is clicked on - you'd have to implement that in frames if that was the desired behavior.
There are any number of ways of displaying many elements in one GUI, e.g.:
CardLayout
(short demo.). Good for:- Showing wizard like dialogs.
- Displaying list, tree etc. selections for items that have an associated component.
- Flipping between no component and visible component.
JInternalFrame
/JDesktopPane
typically used for an MDI.JTabbedPane
for groups of components.JSplitPane
A way to display two components of which the importance between one or the other (the size) varies according to what the user is doing.JLayeredPane
far many well ..layered components.JToolBar
typically contains groups of actions or controls. Can be dragged around the GUI, or off it entirely according to user need. As mentioned above, will minimize/restore according to the parent doing so.- As items in a
JList
(simple example below). - As nodes in a
JTree
. - Nested layouts.
But if those strategies do not work for a particular use-case, try the following. Establish a single main JFrame
, then have JDialog
or JOptionPane
instances appear for the rest of the free-floating elements, using the frame as the parent for the dialogs.
Many images
In this case where the multiple elements are images, it would be better to use either of the following instead:
- A single
JLabel
(centered in a scroll pane) to display whichever image the user is interested in at that moment. As seen inImageViewer
. - A single row
JList
. As seen in this answer. The 'single row' part of that only works if they are all the same dimensions. Alternately, if you are prepared to scale the images on the fly, and they are all the same aspect ratio (e.g. 4:3 or 16:9).
Java: How cursor automatically move from one TextField to other
interesting enough question to try improving my shadowy knowledge of the text package :-)
There are two separate requirements here
- restrict the lenght of the text: that's done with a DocumentFilter as @mKorbel already noted
- automatically transferFocus to the next component after the max length is reached: turns out that can be done with a NavigationFilter
in code:
JComponent panel = new JPanel();
final int maxSize = 3;
for (int i = 0; i < 4; i++) {
final JTextField field = new JTextField(5);
NavigationFilter filter = new NavigationFilter() {
@Override
public void setDot(FilterBypass fb, int dot, Bias bias) {
if (dot >= maxSize) {
fb.setDot(0, bias);
field.transferFocus();
return;
}
fb.setDot(dot, bias);
}
@Override
public void moveDot(FilterBypass fb, int dot, Bias bias) {
if (dot >= maxSize) {
fb.setDot(0, bias);
field.transferFocus();
return;
}
fb.moveDot(dot, bias);
}
};
field.setNavigationFilter(filter);
((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentSizeFilter(maxSize));
panel.add(field);
}
The documentFilter is the one from the Swing Tutorial
Related Topics
Can the Android Sdk Work with Jdk 1.7
How to Install Intellij Idea on Ubuntu
Why Does Priorityqueue.Tostring Return the Wrong Element Order
Cannot Create an Array of Linkedlists in Java
How to Terminate Scanner When Input Is Complete
How to Randomize Two Arraylists in the Same Fashion
Can a Java Class Add a Method to Itself at Runtime
Differencebetween Compare() and Compareto()
Updating Java Priorityqueue When Its Elements Change Priority
Generic Type Inference Not Working with Method Chaining
Running Shell Commands Though Java Code on Android
Installing Oracle Jdk on Windows Subsystem for Linux
How to Switch JPAnels Inside a Jframe
What Operations in Java Are Considered Atomic
How to Add an Actionlistener Onto a Jbutton in Java
Why Doesn't Mockito Mock Static Methods
Java Stack Overflow Error - How to Increase the Stack Size in Eclipse