Java 挥杆作画
我有一个扩展JPanel的类(Timeline)。时间轴面板包含许多手动定位的JLabel(绿色和橙色元素)(“空布局”)。在时间线的顶部有一些用于在月份之间切换的按钮。有时,当我在月份之间切换时,swing不会绘制JLabel,而是始终绘制网格背景 我已经尝试过许多“神奇”的方法(重新绘制、重新验证、失效、验证、更新) 已成功绘制时间线: 喷漆失败: 举个简单的例子:Java 挥杆作画,java,swing,jlabel,graphics2d,null-layout-manager,Java,Swing,Jlabel,Graphics2d,Null Layout Manager,我有一个扩展JPanel的类(Timeline)。时间轴面板包含许多手动定位的JLabel(绿色和橙色元素)(“空布局”)。在时间线的顶部有一些用于在月份之间切换的按钮。有时,当我在月份之间切换时,swing不会绘制JLabel,而是始终绘制网格背景 我已经尝试过许多“神奇”的方法(重新绘制、重新验证、失效、验证、更新) 已成功绘制时间线: 喷漆失败: 举个简单的例子: public interface IDateSelectorRegistrar { void addListener
public interface IDateSelectorRegistrar {
void addListener(DateSelectorListener listener);
void removeListener(DateSelectorListener listener);
}
public interface DateSelectorListener {
void dateChanged(Timestamp from, Timestamp to);
}
public interface ITimelineModel {
Timespan[] getTimespans(Timestamp from, Timestamp to);
}
public class Timespan {
private String title;
private Timestamp to;
private Timestamp from;
public Timespan(String title, Timestamp from, Timestamp to) {
this.title = title;
this.from = from;
this.to = to;
}
// setters and getters
}
public class TimelineLabel extends JLabel {
public TimelineLabel(Timespan timespan) {
super(timespan.getTitle());
}
@Override
protected void paintComponent(Graphics g) {
// paint colored background
super.paintComponent(g);
}
}
public class Timeline extends JPanel {
public Timeline(final ITimelineModel model, IDateSelectorRegistrar registrar) {
registrar.addListener(new DateSelectorListener() {
public void dateChanged(Timestamp from, Timestamp to) {
Timeline.this.removeAll();
Timespan[] timespans = model.getTimespans(from, to);
for(Timespan timespan : timespans) {
TimelineLabel label = new TimelineLabel(timespan);
Timeline.this.add(label);
// label positioning because of Timestamp object data
}
// repaint of timeline
Timeline.this.invalidate();
Timeline.this.repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
// paint background grid
super.paintComponent(g);
}
}
作为一种选择,考虑,这是理想的时域图,并承认各种定制。可以找到如下所示的示例
按以下顺序调用以下方法修复了该问题:
invalidate();
repaint();
validate();
当绘制失败时,您是否检查了相关的绘制/绘制组件方法是否被调用?@endian我从未见过,您是否通过工具插入将这些JLabel放置到JPanel中???,JLabel的绘制组件方法未被调用。@mKorbel否,我使用no layout manager并手动定位标签以更快地获得更好的帮助,张贴一封电子邮件。为了保持理智,将定位逻辑包装在(自定义)
TimeLineLayout
中。