我正在创建一个带有JPanel的表单,用于某些图形和一些用于控制该事物的按钮。出于某种原因,我必须指定JPanel比我想放入的实际图形宽10 px,高30 px。是什么导致了这个问题?
这是代码:
public class Window {
public Sheepness sheepness;
public ButtonPanel buttonPanel;
public PaintPanel paintPanel;
public JFrame frame;
public Window(Sheepness sheepness) {
this.sheepness = sheepness;
frame = new JFrame("Sheepness simulation");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//frame.setSize(width, height);
BorderLayout frameLayout = new BorderLayout();
JPanel background = new JPanel(frameLayout);
background.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
buttonPanel = new ButtonPanel(this);
background.add(BorderLayout.SOUTH, buttonPanel.buttonBox);
paintPanel = new PaintPanel(this);
paintPanel.setPreferredSize(new Dimension(320, 240));
background.add(BorderLayout.CENTER, paintPanel);
frame.getContentPane().add(background);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
}
public class PaintPanel extends JPanel {
public Window window;
public PaintPanel(Window window) {
this.window = window;
}
@Override
public void paintComponent(Graphics g) {
g.setColor(Color.blue);
g.fillRect(0, 0, 320, 240);
}
}
屏幕截图,首选尺寸为320 x 240:
Can't find source image http://www.cmbi.ru.nl/~estens/Sheepness/Sheepness_simulation_border.png
您可以看到320 x 240 fillRect未完全填充JPanel,宽度为10像素,高度保持30像素的边框。
屏幕截图,首选尺寸为310 x 210:
Can't find source image http://www.cmbi.ru.nl/~estens/Sheepness/Sheepness_simulation_noBorder.png
现在它完全适合320 x 240 fillRect!
有什么想法吗?
答案 0 :(得分:4)
不同的布局管理器使用不同的规则来计算实际的托管控件大小,即只有当您在其上调用'setPreferredSize()'时才能指望该面板具有特定的大小。
随意检查所有目标布局管理器的javadoc,以获取有关每种特定情况下使用的算法的更多详细信息。
另请注意,您可以避免使用布局管理器,并通过'setBounds()'方法绝对定义所有尺寸。
答案 1 :(得分:2)
信不信由你,但尝试颠倒pack()和setResizeable()的顺序
...
frame.setResizable(false);
frame.pack(); // should be called after any changes
frame.setVisible(true);
编辑:使用此
进行检查 frame.pack();
frame.setResizable(false);
System.out.println(paintPanel.getSize());
frame.setVisible(true);
System.out.println(paintPanel.getSize());
和
frame.setResizable(false);
frame.pack();
System.out.println(paintPanel.getSize());
frame.setVisible(true);
System.out.println(paintPanel.getSize());
但如果尺寸不重要,可以用
填充实际区域@Override
public void paintComponent(Graphics g) {
g.setColor(Color.blue);
g.fillRect(0, 0, getWidth(), getHeight());
}
[]]
答案 2 :(得分:1)
这是一个独立的测试用例,基于您的代码:
import java.awt.*; import javax.swing.*; public class Test { public PaintPanel paintPanel; public JFrame frame; public Test() { frame = new JFrame("Sheepness simulation"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //frame.setSize(width, height); BorderLayout frameLayout = new BorderLayout(); JPanel background = new JPanel(frameLayout); background.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); paintPanel = new PaintPanel(this); paintPanel.setPreferredSize(new Dimension(320, 240)); background.add(BorderLayout.CENTER, paintPanel); frame.getContentPane().add(background); frame.pack(); frame.setResizable(false); frame.setVisible(true); } public static class PaintPanel extends JPanel { public Test window; public PaintPanel(Test window) { this.window = window; } @Override public void paintComponent(Graphics g) { g.setColor(Color.blue); g.fillRect(0, 0, 320, 240); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new Test(); } }); } }
当我在Linux上的IcedTea JVM上运行它时,我看到this。
您的问题是由于按钮容器强制窗口变宽,或者可能是由于您正在使用的Java版本中存在Swing错误。
我的建议是不要打扰内置的布局类,而是使用MigLayout。
答案 3 :(得分:0)
我猜你的屏幕截图标签错了。
如果指定
g.fillRect(0, 0, 310, 210);
在PaintPanel和
中paintPanel.setPreferredSize(new Dimension(320, 240));
在窗口中。你得到第一个截图显示的内容。这是有道理的,因为矩形的宽度减少了10px,高度减少了30px。
如果为两者设置相同的(宽度/高度; 310,210),蓝色矩形显然会“填充”PaintPanel。