Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JPanel大小强制为图形大小?_Java_Swing_User Interface - Fatal编程技术网

Java 如何将JPanel大小强制为图形大小?

Java 如何将JPanel大小强制为图形大小?,java,swing,user-interface,Java,Swing,User Interface,我有一个带有paintComponent方法的JPanel,它可以把东西画成正方形。我希望这个正方形在我的JFrame中始终水平居中(填充框架的整个高度),并且有两个黑色JPanel(每侧一个)填充其余的宽度(它们将包含按钮和文本) 但是,我无法强迫包含图形对象的JPanel符合我的需要。JPanel总是占据屏幕的其余部分,我不知道如何解决这个问题,也不知道如何迫使侧面板位于正方形的两侧 我想要实现的目标: 我现在所拥有的: 您想要的不是Java Swing通常如何分配空间 我创建了一个GUI

我有一个带有paintComponent方法的JPanel,它可以把东西画成正方形。我希望这个正方形在我的JFrame中始终水平居中(填充框架的整个高度),并且有两个黑色JPanel(每侧一个)填充其余的宽度(它们将包含按钮和文本)

但是,我无法强迫包含图形对象的JPanel符合我的需要。JPanel总是占据屏幕的其余部分,我不知道如何解决这个问题,也不知道如何迫使侧面板位于正方形的两侧

我想要实现的目标:

我现在所拥有的:


您想要的不是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教程。如果左侧/右侧的面板宽度相同,则将添加到中间的涂漆面板将仅居中。非常感谢!这正是我需要的。