1

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

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

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

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

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

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())); 
     }
}

哪个是实现这一点的最佳布局管理器。

4

1 回答 1

1

这将取决于您在时间表上放置的内容。如果是固定时间段(小时、半小时等),那么 aGridLayout将是最简单的选择。

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

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

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

于 2013-11-06T14:33:50.280 回答