TimeLine栏的布局管理器

时间:2013-11-06 13:55:42

标签: java swing layout

我正在尝试创建一个时间轴小部件,一个水平条。

class TimeBar extends JPanel {
  public TimeBar(List<TimeRange> ranges) {
  ....
  }
}

左边代表00:00,右边代表23:59。我必须用不同的颜色标记这个条的一些部分(时间范围)。 List<TimeRange> timeRanges(例如{10:34 - 12:49,RED},{13:31-17:03,蓝色})。 timeRanges之间不存在重叠。

栏应该是可扩展的(当mainFrame改变大小时)但它的最小大小应为700 x 25. TimeRangePanel应该是可点击的。

我已经为TimeBarPanel使用了setLayout(null),为TimeRangePanel使用了setSize和setLocation。当TimeBarPanel改变大小时,我重新计算TimeBarPanel的大小和位置。但是使用LayoutManager手动设置setLocation并不是一个很好的做法。

public class TimeRange { 
   Date startTime,
   Date endTime,
   Color color
} 

public class TimeBar extends JPanel
{
    private List<TimeRange> ranges;

    public TimeBar( List<TimeRange> ranges) {
    this.ranges = ranges;
        setLayout( null );
        setBackground( Color.GRAY );
        setMinimumSize( new Dimension( 720, 25 ) );

       for(TimeRange range : ranges  ) {
           int startX = calculateStartPoint(range);
           int widthX = calculateWidth(range)
           TimeRangePanel panel =  new TimeRangePanel(startX, widthX, range.color)
           add(panel);   
       }
    }
}

public class TimeRangePanel extends JPanel 
{
     public TimeRangePanel(int startX, int widthX, Color color) {
    setBackground(color);
    setSize(widthX, HEIGHT);
        setLocation(startX, 0 );
        setBounds(new Rectangle(new Point(startX, 1), getPreferredSize())); 
     }
}

哪个是实现此目的的最佳布局管理器。

1 个答案:

答案 0 :(得分:1)

这取决于你在时间轴上的内容。如果它是固定的时间段(小时,半小时等),那么GridLayout将是最简单的选择。

如果您要重叠多个项目,那么TableLayoutGridBagLayout是不错的选择。

对于某种类型的布局管理器而言,几乎任何情况都会比不使用布局管理器更好。但是,如果你真的需要一些花哨的东西并且不需要时间轴上的组件,你可以看一下创建一个覆盖paintComponent的自定义组件来绘制带有突出显示范围的时间轴。

有关建议布局的更多信息的教程或链接: http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html Java TableLayout