java - 设计: extend JPanel twice or pass JPanel as parameter?

标签 java swing inheritance drawing jpanel

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

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

  • 画几条线
  • 绘制多个字符串

广告

  1. 接近拉伸(stretch)两次

如果我只需要画线,那么我可以从以下答案中复制过去的解决方案。

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 只是无用的中间类。

  • 创建两个类 LineDrawer 和 StringDrawer 并将 JPanel 作为参数传递给某个执行绘图的方法。我需要调用的问题是不推荐的。
  • Performing Custom Painting

    Graphics g = panel.getGraphics();
    

    您有什么想法和建议?

    UPD: JPanel 内部有许多 JLabels 作为子项,代表单位和特征。

    线条是单位某些特征之间的关系,字符串是某些操作的通知。

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

    JPanel 也位于 JScrollPane 内部。

    最佳答案

    如果您需要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);
    }
    

    然后您就可以使用垃圾神的解决方案,几乎不需要任何更改。

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

    关于java - 设计: extend JPanel twice or pass JPanel as parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13563840/

    相关文章:

    java - 在 Spring 使用 ResponseBody 上传图片

    java - 使用 json 将 Android 连接到 ASP.NET MVC

    java - 如何获取特定缓冲图像的路径?

    java - Java Swing 应用程序中类似 Qtip 的气泡

    java - 从实体类填充 gui 类中的 jlist

    inheritance - Kotlin:类继承了包含伴随对象的接口(interface),但无权访问接口(interface)的常量

    java - 使用 Java 将命令发送到 gsm 调制解调器

    java - 使用类和接口(interface)的代码

    java - 当参数化类型传递层次结构时,在 Java 中创建泛型类型的实例吗?

    c++ - 元类会取代继承吗?