我目前正在尝试实现一个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 - 表示输出图像大小的整数类型变量。 示例 以下程序演示如何旋转图像。 假定以下是上述程序中指定的输入图像:。 执行上面示例代码,得到以下结果 -