我正在设计一个配置托盘的应用程序,我有一个扩展jlabel
的类,我用它创建带有旋转文本的JLabels。我在网上找到了几个关于如何这样做的例子,我的旋转工作很好,它不是完美的,但这是一个正在进行的工作。
我现在遇到的问题是我旋转的JLabels中的文本重复了,我不知道为什么。下面是一张图片,显示了每个标签中的重复文本,它在一些地方比在其他地方更突出,例如与高度标签的重复可以清楚地看到。
下面是我的RotatableText
类的源代码,它扩展了JLabel
。
public class RotatableText extends JLabel
{
private static final long serialVersionUID = 1L;
private String text;
private double angle;
public final static String DEGREES = "deg";
public final static String RADIANS = "rad";
private final static double TO_RADIANS = Math.PI/180;
private final static double TO_DEGREES = 180/Math.PI;
/**
* Creates text rotated by angle in a clockwise direction if clockwise is true,
* or anti-clockwise if it's false
* @param angle angle to be rotated by in degrees
* @param clockwise determines direction of rotation@exception Exception if angleUnit is not RotatableText.DEGREES or RotatableText.RADIANS
*/
public RotatableText(String text, double angle, boolean clockwise, final String angleUnit) throws IllegalAngleUnitException
{
if (!(angleUnit.equals(DEGREES) || angleUnit.equals(RADIANS)))
{
throw new IllegalAngleUnitException("Invalid Angle Selected");
}
else if (angleUnit.equals(DEGREES))
{
if (!clockwise)
{
this.angle = -angle * TO_RADIANS;
super.setText(text);
}
else
{
this.angle = angle * TO_RADIANS;
super.setText(text);
}
}
else if (angleUnit.equals(RADIANS))
{
if (!clockwise)
{
this.angle = -angle;
super.setText(text);
}
else
{
this.angle = angle;
super.setText(text);
}
}
setVerticalAlignment(JLabel.TOP);
setHorizontalAlignment(JLabel.LEFT);
}
/**
* Creates text rotated by angle in an anti-clockwise rotation
* @param angle angle to be rotated by in degrees
* @exception Exception if angleUnit is not RotatableText.DEGREES or RotatableText.RADIANS
*/
public RotatableText(String text, double angle, final String angleUnit) throws IllegalAngleUnitException
{
if (!(angleUnit.equals(DEGREES) || angleUnit.equals(RADIANS)))
{
throw new IllegalAngleUnitException("Invalid Angle Selected");
}
else if (angleUnit.equals(DEGREES))
{
this.angle = angle * TO_RADIANS;
super.setText(text);
}
else if (angleUnit.equals(RADIANS))
{
this.angle = angle;
super.setText(text);
}
setVerticalAlignment(JLabel.BOTTOM);
setHorizontalAlignment(JLabel.CENTER);
}
/**
* Draws the Component
*/
@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.rotate(angle, getPreferredSize().width/2, getPreferredSize().height/2);
g2.drawString(super.getText(), 0, 0);
setBounds(getX(), getY());
super.paintComponent(g);
}
/**
* Gets the text of this RotatableText.
* @return text
*/
public String getText()
{
return super.getText();
}
/**
* Set's bounds with a fixed size
*/
public void setBounds(int x, int y)
{
super.setBounds(x, y, 100, 100);
}
public void setText(String text)
{
super.setText(text);
repaint();
}
/**
* Set the angle of this RotatableText in Radians
* @param angle
*/
public void setAngle(double angle)
{
this.angle = angle;
repaint();
}
/**
* Sets the angle of this RotatableText in the specified unit
* @param angle
* @param angleUnit
* @throws IllegalAngleUnitException
*/
public void setAngle(double angle, String angleUnit) throws IllegalAngleUnitException
{
if (!(angleUnit.equals(DEGREES) || angleUnit.equals(RADIANS)))
{
throw new IllegalAngleUnitException("Invalid Angle Selected");
}
else if (angleUnit.equals(DEGREES))
{
this.angle = angle * TO_RADIANS;
}
else if (angleUnit.equals(RADIANS))
{
this.angle = angle;
}
repaint();
}
/**
* Gets the angle of this RotatableText, anti-clockwise from the horizontal, in degrees.
* @return
*/
public double getAngle()
{
return angle * TO_DEGREES;
}
}
每个标签生成如下(这是长度标签)
lengthLabel = new RotatableText("0", 14, true, RotatableText.DEGREES);
每个标签都是通过以下方式更新的:从其各自的文本字段获取文本,并将其作为label.settext()
的参数传递。
编辑:打印system.out.println(HeightLabel.getText())
只打印文本的一个副本。
如果有人知道为什么会出现这种重复,我很想听听。
谢谢,
山姆。
在代码中绘制文本两次,如下所示:
@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
g2.rotate(angle, getPreferredSize().width/2, getPreferredSize().height/2);
g2.drawString(super.getText(), 0, 0); // ****** here *****
setBounds(getX(), getY());
super.paintComponent(g); // ******* here ******
}
此外,我不会在绘画方法中设置组件的边界,这是一件危险的事情,但请考虑在那里设置Graphics2D剪辑。此外,我还会在图形对象的副本上进行旋转,完成后再处理该副本。否则,你会冒着在涂装链下游传播旋转副作用的风险(如果不想要的话)
例如,
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.rotate(angle, getPreferredSize().width / 2, getPreferredSize().height / 2);
// g2.drawString(super.getText(), 0, 0);
// setBounds(getX(), getY());
// ***** This is a kludge and needs to be calculated better ****
Rectangle clipBounds = g2.getClipBounds();
int extraBounds = 10;
int x = clipBounds.x - extraBounds;
int y = clipBounds.y - extraBounds;
int width = clipBounds.width + 2 * extraBounds;
int height = clipBounds.height + 2 * extraBounds;
g2.setClip(x, y, width, height);
// ***** end kludge
super.paintComponent(g2);
g2.dispose();
}
从上面的图像中可以看到,一些文本被剪掉了:(代码: FONT:http://www.dafont.com/digital-7。FONT 如有任何帮助,我将不胜感激
(图像来自我正在处理的一个小型备份应用程序)。如您所见,上面最后一个,“取消”按钮在右侧被切断。这种行为显然是不可取的,因为文本中更相关的部分被切断了。 来源 到目前为止,我已经尝试将标签内文本的对齐方式更改为,将组件方向更改为,设置,但都无济于事: 我也尝试过使用HTML: 虽然它在我的浏览器中的工作方式是正常的,但swing似乎并不支持足够的样式属性来支持这种行为。 编写一个自己的实现并不是太
我对Java真的很陌生,我想做一个简单的GUI,上面有一个按钮,当你点击它的时候就会有价值,我在YouTube上学习了这个教程。一切都很顺利。但有一点没有,即文本的结尾从一个数字()变为。手动调整窗口的大小会使数字返回,所以我尝试在它启动时在代码中调整字体、窗口、按钮和标签的大小,这确实起作用,但仍然会遇到同样的问题。 这是我的按钮代码: ...我相信它会称之为: 我在其他问题上试过一些其他的解决
问题内容: 尽管进行了许多尝试,但我仍无法获得我想要看到的结果- 文本在JLabel内居中,而JLabel则在BorderLayout中居中。我说“有点”是因为在窗口的右下角还应该有另一个标签“状态”。这是负责的代码: 感谢您提供的任何帮助。 问题答案:
问题内容: 我刚刚开始将Swing应用程序从OS X移植到Windows,使用s会很麻烦。 我注意到,如果标签的文本是HTML ,则指定为的字体将被忽略(在Mac上不会发生)。HTML格式极其有用,可提高复杂显示的可读性。 通常情况下,我会在HTML标记中指定字体,但是我使用的字体是在运行时通过JAR中的ttf 加载的。我尝试在font标签中使用加载的字体的名称,但这没有用。 有什么办法可以在Wi