我正在尝试创建一个时间轴小部件,一个水平条。
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()));
}
}
哪个是实现此目的的最佳布局管理器。
答案 0 :(得分:1)
这取决于你在时间轴上的内容。如果它是固定的时间段(小时,半小时等),那么GridLayout
将是最简单的选择。
如果您要重叠多个项目,那么TableLayout
或GridBagLayout
是不错的选择。
对于某种类型的布局管理器而言,几乎任何情况都会比不使用布局管理器更好。但是,如果你真的需要一些花哨的东西并且不需要时间轴上的组件,你可以看一下创建一个覆盖paintComponent
的自定义组件来绘制带有突出显示范围的时间轴。
有关建议布局的更多信息的教程或链接: http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html Java TableLayout