【问题标题】:Centering a fixed size canvas in a JFrame在 JFrame 中居中固定大小的画布
【发布时间】:2017-01-02 20:17:38
【问题描述】:

我正在创建一个电路编辑器(类似于任何具有基本菜单和可指定尺寸的画布的常规绘图软件)。我目前正在尝试将以前不可滚动的画布 (JPanel) 转换为可滚动的画布。

目前明显的设计错误是,虽然滚动条似乎正确反映了画布的内部大小(当然可以比 JFrame 大得多),但由于添加了画布 JPanel主面板的BorderLayoutCENTER,它总是与JFrame 一起调整大小。

public final class MainFrame extends JFrame 
{
    public MainFrame()
    {            
        JPanel menuPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        // Populate Menu Panel
        // ...

        JPanel canvasPanel = new JPanel();
        canvasPanel.setBackground(Color.white);
        Dimension canvasDims = new Dimension(800,600);        
        canvasPanel.setPreferredSize(canvasDims);
        canvasPanel.setMinimumSize(canvasDims);
        canvasPanel.setMaximumSize(canvasDims);

        JScrollPane canvasScrollPane = new JScrollPane(
            canvasPanel,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        JPanel masterPanel = new JPanel(new BorderLayout());
        masterPanel.add(menuPanel, BorderLayout.NORTH);
        masterPanel.add(canvasScrollPane, BorderLayout.CENTER);

        setContentPane(masterPanel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(1200, 700);
        setMinimumSize(new Dimension(500, 500));
        setLocationRelativeTo(null);
        setVisible(true); 
    }

我已经阅读了很多关于 JPanel 和滚动条居中的帖子,但是将这两种复杂性加在一起,事情可能会更复杂一些,因为我还没有找到解决方案。

我真正想要实现的是将画布'JPanel 固定为用户可能指定的任何大小并居中,以及滚动条的行为就像人们在心爱的窗口中所期望的那样'油漆:

你会如何做这个/修复我的设计?任何帮助将不胜感激!

附:新年快乐:)

【问题讨论】:

    标签: java swing layout


    【解决方案1】:

    JPanel 固定在用户可能指定的任何大小并居中,滚动条的行为与预期一致

    因此您需要嵌套面板,以便画布面板可以以其首选大小显示,而父面板则根据框架的大小调整大小。

    一个简单的方法是使用JPanel,它使用GridBagLayout。然后使用默认的GridBagConstraints 将画布面板添加到此面板。

    所以面板的基本结构是:

    JPanel canvas = new JPanel();
    canvas.setPreferredSize( new Dimension(300, 300) );
    canvas.setBackground(Color.RED);
    
    JPanel wrapper = new JPanel( new GridBagLayout() );
    wrapper.add(canvas, new GridBagConstraints() );
    
    frame.add(new JScrollPane(wrapper));
    

    注意:不需要您的“masterPanel”。 JFrame 的内容窗格的默认布局管理器是 BorderLayout,因此您只需使用适当的 BorderLayout 约束将“menuPanel”和“scrollPane”直接添加到框架中。

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多