设计:将JPanel扩展两次或将JPanel作为参数传递?

时间:2012-11-26 11:24:15

标签: java swing inheritance drawing jpanel

我这里有设计问题。有两种选择听起来可以实现,但我不喜欢这两种选择。

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

  • 画几行
  • 画几个字符串

广告

  1. 接近延长两次
  2. 如果我只需要绘制线条,那么我可以从以下答案中复制过去的解决方案。

    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作为参数传递给一些执行绘图的方法。这里的问题是我需要调用哪个不推荐。
    2. Performing Custom Painting

      Graphics g = panel.getGraphics();
      

      您的想法和建议是什么?

      UPD: 在JPanel里面有作为孩子的数字JLabel代表单位和特征。

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

      所以我想在子JLabel的顶部(前面)显示String。

      JPanel也在JScrollPane中。

1 个答案:

答案 0 :(得分: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它将不会显示在屏幕上。