java - 如何强制 JPanel 大小为 Graphic 大小?
问题描述
我有一个带有paintComponent 方法的JPanel,可以将事物绘制成方形。我希望该正方形始终在我的 JFrame 中水平居中(填充框架的整个高度),并让两个黑色 JPanel(每侧一个)填充其余宽度(它们将包含按钮和文本)。
但是我无法强制包含 Graphic 对象的 JPanel 是我需要的。JPanel 总是填满屏幕的其余部分,我不知道如何解决这个问题或强制侧面板来到正方形的两侧。
我想达到的目标:
我现在拥有的:
解决方案
您想要的不是 Java Swing 通常如何分配空间。
我创建了一个保持中心JPanel
正方形的 GUI。
这是定义大小的 GUI。
这是我手动拉伸后的 GUI。
Stack Overflow 缩小了图像以适应答案。您可以判断,因为文本字体似乎缩小了。
注意:如果您通过单击右上角的方块来最大化 GUI,您将无法将 GUI 恢复到其原始大小。
我通过创建三个JPanels
并设置它们的首选大小来做到这一点。我把这三个JPanels
放在 main 里面,JPanel
我用ComponentListener
.
当您JFrame
通过抓取边缘并拖动来调整大小时, 会ComponentListener
计算三个 的新大小JPanels
,保持中心正方形,并在 left和 rightJPanel
之间划分其余空间。JPanel
JPanel
我用FlowLayouts
了三个JPanels
。您也可以使用GridBagLayout
. 您选择使用的布局管理器必须尊重JPanel
调整大小。
这是完整的可运行代码。
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class TripleJPanelGUI implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new TripleJPanelGUI());
}
private JFrame frame;
private JPanel leftPanel;
private JPanel centerPanel;
private JPanel rightPanel;
@Override
public void run() {
frame = new JFrame("Triple JPanel GUI");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
PanelListener listener = new PanelListener(this);
frame.add(createMainPanel(listener), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JPanel createMainPanel(PanelListener listener) {
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING, 0, 0));
panel.addComponentListener(listener);
leftPanel = createLeftPanel();
centerPanel = createCenterPanel();
rightPanel = createRightPanel();
panel.add(leftPanel);
panel.add(centerPanel);
panel.add(rightPanel);
return panel;
}
private JPanel createLeftPanel() {
JPanel panel = new JPanel(new FlowLayout());
panel.setBackground(Color.YELLOW);
panel.setPreferredSize(new Dimension(100, 400));
JLabel label = new JLabel("JPanel");
label.setFont(panel.getFont().deriveFont(24f));
panel.add(label);
return panel;
}
private JPanel createCenterPanel() {
JPanel panel = new JPanel(new FlowLayout());
panel.setBackground(Color.GREEN);
panel.setPreferredSize(new Dimension(400, 400));
JLabel label = new JLabel("Always a Square");
label.setFont(panel.getFont().deriveFont(24f));
panel.add(label);
return panel;
}
private JPanel createRightPanel() {
JPanel panel = new JPanel(new FlowLayout());
panel.setBackground(Color.BLUE);
panel.setPreferredSize(new Dimension(100, 400));
JLabel label = new JLabel("JPanel");
label.setFont(panel.getFont().deriveFont(24f));
label.setForeground(Color.WHITE);
panel.add(label);
return panel;
}
public void updateLeftPanel(int width, int height) {
leftPanel.setPreferredSize(new Dimension(width, height));
}
public void updateCenterPanel(int width, int height) {
centerPanel.setPreferredSize(new Dimension(width, height));
}
public void updateRightPanel(int width, int height) {
rightPanel.setPreferredSize(new Dimension(width, height));
}
public JFrame getFrame() {
return frame;
}
private class PanelListener extends ComponentAdapter {
private TripleJPanelGUI frame;
public PanelListener(TripleJPanelGUI frame) {
this.frame = frame;
}
@Override
public void componentResized(ComponentEvent event) {
JPanel panel = (JPanel) event.getSource();
Dimension d = panel.getSize();
int width = (d.width - d.height) / 2;
int height = d.height;
frame.updateLeftPanel(width, height);
frame.updateCenterPanel(height, height);
frame.updateRightPanel(width, height);
frame.getFrame().pack();
}
}
}
推荐阅读
- javascript - 使用 addEventListener 阻塞 onClick 处理程序
- dart - 广告未在 iOS 设备上展示
- kotlin - 无法解决:org.jetbrains.anko:anko:1.10.5
- mysql - 带有 ORDER BY 的 MySQL 行号
- racket - How to make a picture using Racket
- c# - 使用 WndProc 和 mciSendString 来确定音频文件是否已结束
- ios - 如何从样式分组的表格视图中删除多余的空间?
- aws-codecommit - 多账户代码提交设置 aws
- angular - 如何在角度 5 的嵌套 json 数组中发布值?
- python - Tkinter Python OOP:使用 canvas.move() 一次移动单独的小部件