2012-11-26 37 views
0

我在这里有设计问题。听起来有两种可能的选择,但我不喜欢这两种选择。设计:扩展JPanel两次或传递JPanel作为参数?

我需要在我的JPanel中提供两个功能。

  • 画几条线
  • 画几个字符串

广告

  1. 方法两次

延长。如果我只需要画线,然后我就可以复制从以下答案中选择最佳解决方案。

Draw a line in a JPanel with button click in Java

public class LinePanel extends JPanel { 
... 
@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    ... 

但因为我需要添加第二个功能,我需要做这样的事情

public class LineStringPanel extends JPanel { 

这会使LinePanel只是无用的中级班。

  1. 创建两个类LineDrawer和StringDrawer,并将JPanel作为参数传递给将执行绘制的某个方法。这里的问题,我需要调用哪个不被推荐。

Performing Custom Painting

Graphics g = panel.getGraphics(); 

你觉得可以推荐?

UPD: 在JPanel内部有数量众多的JLabels作为代表单元和特征的子代。

这些行是单位的一些特征之间的关系,字符串是一些行为的通知。

所以我想在儿童JLabels的顶部(正面)显示字符串。

另外JPanel在JScrollPane中。

+3

绘制到'BufferedImage'并显示在'JLabel'中,如[本答案](http://stackoverflow.com/a/12683632/418556)所示。 –

+0

@Nikolay库兹涅佐夫请不要攻击,默认情况下工具和扩展是关于很短的例子作为答案....,图形g = panel.getGraphics();是关于打印到文件,快照,过期(内部)在第一个事件从相关的API,请你最终的目标 – mKorbel

+0

@AndrewThompson,这个JPanel应该有许多子组件 - JLabels与ImageIcons。线条和字符串应该是最前面的,将显示在JLabels上方。你认为它会起作用吗? –

回答

4

如果需要draw strings,你可以这样直接在paintComponent方法做(假设你不需要什么太花哨,这是很容易):

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    ... 
    g.drawLine(p1.x, p1.y, p2.x, p2.y); 
    ... 
    g.setColor(Color.black); 
    g.drawString("My Text", 0, 20); 
} 

然后,你可以用你的trashgod的解决方案几乎没有任何变化。

请记住,坐标是文本的基线 - 所以如果您使用0,0它不会显示在屏幕上。

+1

正;另请参阅[*创建标签以及drawlines *](http://stackoverflow.com/q/5394364/230513)。 – trashgod