2017-01-02 67 views
1

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

Circuit Editor

此刻的明显的设计错误是,当滚动条看上去以正确反映画布的内部尺寸(这当然可以比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); 
    } 

我读过关于中心JPanels和滚动条相当多的职位,但既复杂性加在一起,因为我还没有找到一个解决办法的事情可能会有点复杂。

我真正想要实现的是将画布“JPanel”固定为用户可能指定并居中在中间的任意大小,以及滚动条的行为与人们期望的那样:

enter image description here

你怎么会去这样做/固定我的设计?任何帮助将不胜感激!

P.S.新年快乐:)

回答

1

的JPanel固定在任何大小的用户可能已经指定,并在中间,以及表现为滚动条中心的人们所期望的

所以,你需要嵌套面板使画布面板可以按其首选大小显示,而父面板则根据框架大小调整大小。

一个简单的方法就是使用GridBagLayoutJPanel。然后,使用默认的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,因此您只需将“menuPanel”和“scrollPane”直接添加到具有适当的BorderLayout约束的框架。

+0

工作很好!非常感谢! –