2014-09-28 34 views
0

根据我的要求:垂直JPanel手动定位:哪种布局?

  • JPanels的单个垂直列。
  • 设置JPanel的垂直位置*而不使用兄弟的属性。
  • 当框架被调整大小时,组件的位置和大小是固定的。
  • 保持其他布局方面的自动(如优选的尺寸计算),尽可能

(*)位置:我的意思是定位在Component.setLocation(x, y)

是否有解决方案,这是明显的,如果这是GridBagLayout,如何做到这一点?

详情:

我想唯一指定其垂直位置,把组件垂直一列容器(如垂直框)。在不失去布局布局的其他好处的情况下做到这一点的最佳方式是什么?

在垂直框,设置组件的垂直位置,必须使用一个filler来完成,或者通过调整正上方的部件的尺寸,也没有像这样的可能性:

panel.setLocation(getLocation().x, y) 

在另一方面使用无布局容器穿上我的任务管理:

  • 组件
  • 容器调整大小事件的初始大小。

这里推荐的null layout的解决方案,在这里,这是一个custom之一,在这里,这是GridBagLaout。此外MIGLayout似乎是普遍的(但我不希望添加另一个库到我的项目)。

+0

为什么不使用'JList'? – 2014-09-28 09:43:45

+0

*“我专注于布局”*当布局是关键时,人们经常忽略布局。有时候,当一种完全不同的方法可能更好时(例如列表,树,工具栏,选项卡窗格),人们会将注意力集中在布局上。例如。这个接受的[answer](http://stackoverflow.com/a/26080729/418556)似乎在Rob Camick的'WrapLayout'中,但在答案中的3种方法中,我可能会使用'JList'。不止一种方法去皮肤那只猫。 ;) – 2014-09-28 10:05:02

+0

尝试我的解决方案http://stackoverflow.com/a/26084135/1966247 – Muhammad 2014-09-28 10:51:49

回答

2

我已经写了下面的程序给那些也在寻找相同要求的人。

注意:确保将第一个元素添加到0的位置,因为不会有更多的组件,并且除0,2到0或1,3到0或1或2之外没有可用的位置,等等

public class VerticalList extends JFrame { 

    JPanel pnl = null; 
    TextField tf = new TextField(10); 
    Box center = Box.createVerticalBox(); 
    JScrollPane jsp = new JScrollPane(center); 
    JPanel ctrl = new JPanel(new FlowLayout()); 
    JButton send = new JButton("Send"); 


    public VerticalList() { 
     jsp.setAutoscrolls(true); 
     ctrl.add(send); 
     ctrl.add(new JLabel("Position:")); 
     ctrl.add(tf); 
     Container cnt = getContentPane(); 

     cnt.add(jsp, BorderLayout.CENTER); 
     cnt.add(ctrl, BorderLayout.SOUTH); 
     send.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       pnl = new JPanel(new FlowLayout()); 

       pnl.setBorder(BorderFactory.createLineBorder(Color.red)); 
       pnl.add(new JLabel("Added to Position: "+tf.getText())); 

       pnl.setMaximumSize(new Dimension(Integer.MAX_VALUE, (int)pnl.getPreferredSize().getHeight())); 
       try{ 
       int index = Integer.parseInt(tf.getText()); 
       center.add(pnl, index); 
       }catch(Exception ex){ 
        JOptionPane.showMessageDialog(null, "Please Provide a Valid position", "Position Error", JOptionPane.ERROR_MESSAGE); 
       } 
       validate(); 
      } 
     }); 
     setPreferredSize(new Dimension(300, 300)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     pack(); 

    } 

    public static void main(String[] args) { 
     new VerticalList(); 
    } 
} 
+0

谢谢。我不确定自己的理解是否正常,似乎是将面板添加到容器中,在变量兄弟索引中添加面板,然后让布局将它们按正确的顺序排列。我正在寻找的是设置以像素表示的垂直位置。 – mins 2014-09-28 11:06:02

+1

'setPreferredSize(new Dimension(300,300));'请参阅[我应该避免使用Java Swing中的set(Preferred | Maximum | Minimum)Size方法吗?](http://stackoverflow.com/q/7229226/ 418556)(是) – 2014-09-28 11:12:20

+0

@AndrewThompson setPreferredSize(Dim)不是这里的问题,但布局:) – Muhammad 2014-09-28 11:40:03