当前位置: 首页 > 面试题库 >

旋转秋千JLabel

谢涵亮
2023-03-14
问题内容

我目前正在尝试实现一个Swing组件,从JLabel该组件继承应该仅代表可以垂直定向的标签。

从此开始:

public class RotatedLabel extends JLabel {

    public enum Direction {
        HORIZONTAL,
        VERTICAL_UP,
        VERTICAL_DOWN
    }

private Direction direction;

我认为仅更改来自的结果是一个好主意getPreferredSize()

@Override
public Dimension getPreferredSize() {
    // swap size for vertical alignments
    switch (getDirection()) {
        case VERTICAL_UP:
        case VERTICAL_DOWN:
            return new Dimension(super.getPreferredSize().height, super
                .getPreferredSize().width);
        default:
            return super.getPreferredSize();
    }
}

然后Graphics在我将绘画卸载到原始图像之前简单地转换对象JLabel

@Override
protected void paintComponent(Graphics g) {
    Graphics2D gr = (Graphics2D) g.create();

    switch (getDirection()) {
        case VERTICAL_UP:
            gr.translate(0, getPreferredSize().getHeight());
            gr.transform(AffineTransform.getQuadrantRotateInstance(-1));
            break;
        case VERTICAL_DOWN:
            // TODO
            break;
        default:
    }

    super.paintComponent(gr);
}

似乎可以某种方式起作用,因为现在可以垂直显示文本。但是,放置和大小已关闭。

实际上,背景的宽度(在这种情况下为橙色)与周围的高度相同,JFrame这与我的想法不尽相同。

有什么想法如何以适当的方式解决这个问题吗?是否甚至鼓励将渲染委派给超类?


问题答案:

在同事的帮助下,我现在开始工作。基本上,我现在有了一个字段,该字段指示是否交换高度/宽度,该高度/宽度仅在原始对象JLabel进行绘画时有效。

private boolean needsRotate;

@Override
public Dimension getSize() {
  if (!needsRotate) {
    return super.getSize();
  }

  Dimension size = super.getSize();

  switch (getDirection()) {
  case VERTICAL_DOWN:
  case VERTICAL_UP:
      return new Dimension(size.height, size.width);
  default:
    return super.getSize();
  }
}

@Override
public int getHeight() {
  return getSize().height;
}

@Override
public int getWidth() {
  return getSize().width;
}

@Override
protected void paintComponent(Graphics g) {
  Graphics2D gr = (Graphics2D) g.create();

  switch (getDirection()) {
  case VERTICAL_UP:
    gr.translate(0, getSize().getHeight());
    gr.transform(AffineTransform.getQuadrantRotateInstance(-1));
    break;
  case VERTICAL_DOWN:
    gr.transform(AffineTransform.getQuadrantRotateInstance(1));
    gr.translate(0, -getSize().getWidth());
    break;
  default:
  }

  needsRotate = true;
  super.paintComponent(gr);
  needsRotate = false;
}


 类似资料:
  • 问题内容: 我希望程序在2秒后显示。 然后我在之后添加。 但是我不知道为什么程序会停止显示,而不显示,并且“ show test”消息可以成功打印出来 问题答案: 简短的答案,不要。 Swing是一个单线程框架,这意味着阻止事件调度线程的任何事物都将阻止它更新UI或处理任何新事件(使您的UI看起来像是被挂起了)。 当然,您可以使用,但Swing也不是线程安全的。这意味着必须在事件分发线程的上下文内

  • 问题内容: 每当我读到Swing时,他们都会说它们是重量轻的组件。所以我只是在Google Swing上搜索,发现这意味着Swing不依赖于本地同级。这就是为什么它们被称为 “轻量级” ?我的意思是重量轻,我认为Swing组件可能比AWT组件占用更少的内存。不是吗 问题答案: Swing被认为是轻量级的,因为它是完全用Java实现的,而无需调用本机操作系统来绘制图形用户界面组件。 另一方面,AWT

  • 问题内容: 我正在使用JFrame,并且在框架上保留了背景图像。现在的问题是图像的大小小于框架的大小,因此我必须在窗口的空白部分再次保留相同的图像。如果用户单击最大化按钮,则可能需要在运行时将图像放置在框架的空白区域。谁能告诉我如何做到这一点? 问题答案: 您想要Windows桌面的背景图像之类的东西时,多次使用背景图像而不是调整其大小或仅将其居中显示吗? 您只需要保留一次图像,然后在paintC

  • 问题内容: 我想实现一个JTreeTable。我在Java官方网站上看到了该示例。我是Java的初学者,我无法理解该示例。我将树节点和子名称作为字符串。我该如何实施? 问题答案: 有(只有我尝试过的产品) 自由 swingx NetBeans ,在此处说明 Aephyr的出色解决方法 这里的简单代码示例 非自由 积德网格

  • 问题内容: 我是新手,不胜感激。 在这段代码中,我要把一张卡片面朝上,如果发现它们不匹配,我希望它们再次面朝下。 此刻正在发生的事情:1.单击第一张卡片时翻转2.单击第二张卡片时,发生以下两种情况中的任何一种(a)如果它们相同,它们都停留在我想要的状态(b)如果它们并不相同,我根本看不到第二张卡,因为第二张卡会立即重新显示卡的背面(以及我的方法中定义的上一张卡的背面)。 我以为放入睡眠计时器可能会

  • 可以使用类的方法对图像执行旋转操作。以下是这种方法的语法 - 该方法接受以下参数 - src - 表示此操作的源(输入图像)的对象。 dst - 表示此操作的目标(输出图像)的对象。 rotationMatrix - 表示旋转矩阵的对象。 size - 表示输出图像大小的整数类型变量。 示例 以下程序演示如何旋转图像。 假定以下是上述程序中指定的输入图像:。 执行上面示例代码,得到以下结果 -