Java 如何将JPanel大小强制为图形大小?
我有一个带有paintComponent方法的JPanel,它可以把东西画成正方形。我希望这个正方形在我的JFrame中始终水平居中(填充框架的整个高度),并且有两个黑色JPanel(每侧一个)填充其余的宽度(它们将包含按钮和文本) 但是,我无法强迫包含图形对象的JPanel符合我的需要。JPanel总是占据屏幕的其余部分,我不知道如何解决这个问题,也不知道如何迫使侧面板位于正方形的两侧 我想要实现的目标: 我现在所拥有的:Java 如何将JPanel大小强制为图形大小?,java,swing,user-interface,Java,Swing,User Interface,我有一个带有paintComponent方法的JPanel,它可以把东西画成正方形。我希望这个正方形在我的JFrame中始终水平居中(填充框架的整个高度),并且有两个黑色JPanel(每侧一个)填充其余的宽度(它们将包含按钮和文本) 但是,我无法强迫包含图形对象的JPanel符合我的需要。JPanel总是占据屏幕的其余部分,我不知道如何解决这个问题,也不知道如何迫使侧面板位于正方形的两侧 我想要实现的目标: 我现在所拥有的: 您想要的不是Java Swing通常如何分配空间 我创建了一个GUI
您想要的不是Java Swing通常如何分配空间 我创建了一个GUI,它可以保持中心
JPanel
square
这是GUI的定义大小
这是我手动拉伸后的GUI
堆栈溢出缩小图像以适合答案。您可以分辨,因为文本字体似乎在缩小
警告:如果您通过单击右上角的方框来最大化GUI,则您将无法将GUI恢复到其原始大小
为此,我创建了三个jpanel
,并设置了它们的首选大小。我把这三个JPanel
放在主JPanel
的内部,我用组件监听器来监视它的大小
当您通过抓取边并拖动来调整JFrame
的大小时,ComponentListener
计算三个JPanel
的新大小,保持中心JPanel
正方形,并将左JPanel
和右JPanel
之间的剩余空间分开
我对三个jpanel
使用了FlowLayouts
。您还可以使用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();
}
}
}
为了获得更好的帮助,请尽快发布一个适当的演示您的问题的文章,这样我们可以看到您迄今为止所做的工作并从中改进JFrame的默认布局管理器是BorderLayout。因此,请阅读上的Swing教程。如果左侧/右侧的面板宽度相同,则将添加到中间的涂漆面板将仅居中。非常感谢!这正是我需要的。