我注意到秋千上的容器之间有奇怪的行为。
为了举例说明该测试,我创建了一个JFrame和一个JPanel,并将面板设置为
contentPane。我将首选和最大的JPanel大小定义为400,300。所有
这些都可以在下面的示例中看到:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ExcessiveSpacePanelTest {
JFrame frame;
JPanel panel;
public void initGUI(){
frame = new JFrame();
panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
panel.setPreferredSize(new Dimension(400, 300));
panel.setMaximumSize(new Dimension(400, 300));
frame.setContentPane(panel);
frame.pack();
System.out.println("panel size: [" + panel.getSize().width + "," + panel.getSize().height +"]");
System.out.println("frame size: [" + frame.getSize().width + "," + frame.getSize().height+"]");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(() ->{
new ExcessiveSpacePanelTest().initGUI();
});
}
}
The result is:
令我惊讶的是,终端的输出为:
面板尺寸:[400,300]
框架尺寸:[416,338]
我不明白为什么框架会增加这个额外的空间,甚至
在组件中什么也没有迫使框架调整大小。
我尝试通过在panel.setBorder (BorderFactory.createEmptyBorder(0, 0, 0, 0))
;前面添加行来在面板上设置零边缘,pack();但
结果仍然相同。
这样做的问题是java给我一个错误的信息,因为面板
正在缩放框架的大小,从上面的结果可以看出
,两者的大小不一样。
两种措施的报告是否正确?为什么会发生这种情况?
您可能会发现比较
不同平台上类似程序的结果会有所帮助。尤其是,
The red Border
is inside the panel; your usage conforms to the API recommendation, “we recommend that you put the component in a JPanel
and set the border on the JPanel
.”
The frame width matches the panel width on Mac OS X because the heavyweight peer used for the top-level container has no vertical border on Mac OS X; the Windows peer has its own border.
The frame height includes the drag bar and frame border: 38 pixels on Widows, 22 on Mac OS X.
Don’t use setPreferredSize()
when you really mean to override getPreferredSize()
.
As an aside, the frame’s add()
method forwards to the content pane.
panel size: [400,300]
frame size: [400,322]
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ExcessiveSpacePanelTest {
JFrame frame;
JPanel panel;
public void initGUI(){
frame = new JFrame();
panel = new JPanel() {
@Override
public Dimenshtml" target="_blank">ion getPreferredSize() {
return new Dimension(400, 300);
}
};
panel.setBorder(BorderFactory.createLineBorder(Color.RED, 1));
frame.add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
System.out.println("panel size: [" + panel.getSize().width + "," + panel.getSize().height +"]");
System.out.println("frame size: [" + frame.getSize().width + "," + frame.getSize().height+"]");
}
public static void main(String[] args) {
EventQueue.invokeLater(() ->{
new ExcessiveSpacePanelTest().initGUI();
});
}
}
我有一个h2数据库文件,文件大小已经增长到5GB。我删除了一些数据以缩小文件的大小。但即使从数据库中删除了一半记录,文件大小仍然保持不变。 我已经尝试了以下所有选项来减少数据库大小,但没有一个对我有用。 我的连接字符串如下所示: 注: 我们正在结清我们已经开始的交易 文件中没有5GB的数据 有人能给我建议一些解决方法或修复方法来减少我的数据库大小吗
问题内容: 这是 不是 增加Java的堆的最大尺寸的虚拟机启动后。技术原因是什么?垃圾回收算法是否取决于要使用固定数量的内存?还是出于安全原因,通过消耗所有可用内存来防止Java应用程序从DOS的系统中移至其他应用程序? 问题答案: 最后我知道在Sun的JVM中,必须在连续的地址空间中分配整个堆。我想对于大堆值,很难在启动后将其添加到您的地址空间中,同时又要确保它保持连续。您可能需要在启动时获取它
如果我逃跑 在铬33上,我得到 为什么?
我为我的Java web应用程序分配了一个最大值。由于一些内存泄漏,应用程序已经消耗了将近2 GB的分配内存。此时,我已经使用进行了内存转储。在一个实例中,堆转储大小接近>1.5GB,而在另一个实例中,堆转储大小<100 MB。这背后的原因是什么?
我的表: 插入查询: 我的页面大小是16KB。因此,我的表中的一行最多可以包含8192字节(即8KB)。 我创建了11个列(每个255个字符),其中这11列最多可以容纳字符。 如果我存储2805-3字节的字符,它将需要(
//{this.props.params.item}来自反应路由器(路径('/detail/item/id')) 为什么我的调度是无限循环,直到出错(超过最大调用堆栈大小)