Initialize multiple JPanels using a Flow Layout (Homework)
-
24-07-2021 - |
题
I am trying to create a JFrame with two JPanels inserted inside using FlowLayout. I have the frame being initialized in a separate file, but here is what I have being called
public class FlowInFlow extends JFrame
{
public FlowInFlow() {
setLayout(new FlowLayout());
JPanel panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
panel1.setBackground(Color.RED);
JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
panel2.setBackground(Color.BLUE);
}
}
Edit: When I run this I just get a blank box, when I need the two boxes side to side
解决方案
As I've already stated, the default preferred size of a JPanel
is 0x0...
This means that when you add it to a layout like FlowLayout
, the uses the preferred size, it will appear...well...it won't
public class TestFlowLayout {
public static void main(String[] args) {
new TestFlowLayout();
}
public TestFlowLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JPanel master = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel left = new JPanel();
left.setBackground(Color.RED);
left.add(new JLabel("Lefty"));
JPanel right = new JPanel();
right.setBackground(Color.BLUE);
right.add(new JLabel("Righty"));
master.add(left);
master.add(right);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(master);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
其他提示
Besides the advice to change the outer layout, those components were never being added to anything (so would never be visible).
import java.awt.*;
import javax.swing.*;
public class FlowInGrid extends JFrame {
public FlowInGrid() {
setLayout(new GridLayout(1,0));
JPanel panel1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
panel1.setBackground(Color.RED);
// ADD Them to something!
add(panel1);
JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
panel2.setBackground(Color.BLUE);
// ADD Them to something!
add(panel2);
}
public static void main(String[] args) throws Exception {
Runnable r = new Runnable() {
@Override
public void run() {
JFrame f = new FlowInGrid();
f.setSize(300,100);
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
不隶属于 StackOverflow