I'm making an application to act as a hub of some sorts, where the user can store shortcuts to their favorite applications and easily launch them. I'm having some problems with FlowLayout
, though. When I use GridLayout
, the components display perfectly. When I use FlowLayout
, nothing displays at all.
GridLayout:
FlowLayout:
All I have changed is the LayoutManager
. When I call getComponentCount
, they both respond with 9.
I thought this post was pretty long, so I put a snippet of my code on Code Tidy (from Pastebin)
Thank you in advance for your help!
1) FlowLayout
漂亮接受PreferredSize
是从哪里来JComponent
,每个JComponents
能已经得到不同Dimension
的屏幕上
例如(uncomnent getMinimumSize
& getMinimumSize
)
import java.awt.*;
import javax.swing.*;
public class CustomComponent extends JFrame {
private static final long serialVersionUID = 1L;
public CustomComponent() {
setTitle("Custom Component Test / BorderLayout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
}
public void display() {
add(new CustomComponents0(), BorderLayout.NORTH);
add(new CustomComponents0(), BorderLayout.CENTER);
add(new CustomComponents0(), BorderLayout.SOUTH);
add(new CustomComponents0(), BorderLayout.EAST);
pack();
// enforces the minimum size of both frame and component
setMinimumSize(getMinimumSize());
setPreferredSize(getPreferredSize());
setVisible(true);
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
CustomComponent main = new CustomComponent();
main.display();
}
};
javax.swing.SwingUtilities.invokeLater(r);
}
}
class CustomComponents0 extends JLabel {
private static final long serialVersionUID = 1L;
/*@Override
public Dimension getMinimumSize() {
return new Dimension(200, 100);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}*/
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
}
2) GridLayou
吨每创建比例面积JComponents
,然后只接受JComponent
已经得到了较大的Dimnesion
从哪里来PreferredSize
3) GridLayout
我说的方法, pack()
如果是不存在JFrame#setSize()
为FLowLayout
不要紧,
嗯,我知道这已经回答了,但我想补充,如果你看一下下面的代码并运行它,它会创建9个标签和4个按键,并使用流布局添加它们,但与帧大小低于这个例子使用设置setSize(int width,int height)
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class FlowLayoutTest extends JFrame {
private JPanel NorthPanel, SouthPanel;
private JLabel[] labels;
private JButton[] buttons;
public FlowLayoutTest() {
createAndShowUI();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
FlowLayoutTest flowLayoutTest = new FlowLayoutTest();
}
});
}
private void createAndShowUI() {
setTitle("Flow layout");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
initializeComponents();
addComponents(this.getContentPane());
//pack();
setVisible(true);
}
private void initializeComponents() {
labels = new JLabel[9];
for (int i = 0; i < labels.length; i++) {
labels[i] = new JLabel("Label " + (i+1));
}
buttons = new JButton[4];
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton("Button " + (i+1));
}
NorthPanel = new JPanel(new FlowLayout(5));
SouthPanel = new JPanel(new FlowLayout(5));
}
private void addComponents(Container contentPane) {
for (int i = 0; i < buttons.length; i++) {
SouthPanel.add(buttons[i]);
}
for (int i = 0; i < labels.length; i++) {
NorthPanel.add(labels[i]);
}
contentPane.add(NorthPanel, BorderLayout.NORTH);
contentPane.add(SouthPanel, BorderLayout.SOUTH);
}
}
然而,当你运行你会注意到一个标签(9号)已经关闭屏幕的应用,这是因为setSize()
使用,但是如果我们所说的(或在这种情况下,取消注释) pack()
的框架设置为可见之前,你将能看到太多的框架上的所有组件。