Java 创建类似Microsoft word中的边距编辑器组件

Java 创建类似Microsoft word中的边距编辑器组件,java,swing,jcomponent,jspinner,Java,Swing,Jcomponent,Jspinner,我有一个JavaSwing应用程序,我想在其中创建一个很好的组件,就像MicrosoftWord中的组件一样。在Microsoft word中,您可以更改文档的页边距,如下所示: 这里的诀窍是,如果您将上页边距更改为(比方说)1.5“,那么预览图像将更改为显示这一点,因此图像中的行将向下移动一点,以显示页边距的更改,以便用户可以感觉到此更改对文档的影响程度。例如,如果我将左页边距更改为(4.0”)图像将如下所示: 我所做的是创建两个图像一个空白页图像+另一个仅包含行的图像(行图像),如以下两

我有一个JavaSwing应用程序,我想在其中创建一个很好的组件,就像MicrosoftWord中的组件一样。在Microsoft word中,您可以更改文档的页边距,如下所示:

这里的诀窍是,如果您将上页边距更改为(比方说)1.5“,那么预览图像将更改为显示这一点,因此图像中的行将向下移动一点,以显示页边距的更改,以便用户可以感觉到此更改对文档的影响程度。例如,如果我将左页边距更改为(4.0”)图像将如下所示:

我所做的是创建两个图像一个空白页图像+另一个仅包含行的图像(行图像),如以下两个图像:

我将每个图像都插入到一个JLabel中,然后在每个图像的上方插入一个JLabel,现在当我更改JSpinner top margin值时,我会固定“blank page”图像,但我会更改“lines图像”的边框以将其向下移动一点。这个技巧对上页边距效果很好,但是如果我更改下/右/左页边距,行为就会完全错误

以下是我在更改任何JSpinner值时应用的代码:

private void marginSpinnerStateChanged() {
    //1. Get the approximate values of all margins :
        int topMargin = (int)( Float.valueOf( topSpinner.getValue().toString() ) * 8 );
        int bottomMargin = (int)( Float.valueOf( bottomSpinner.getValue().toString() ) * 8 );
        int leftMargin = (int)( Float.valueOf( leftSpinner.getValue().toString() ) * 8 );
        int rightMargin = (int)( Float.valueOf( rightSpinner.getValue().toString() ) * 8 );

    //2. Apply all specified margins to the lines label : 
        linesLabel.setBorder( new EmptyBorder( topMargin, leftMargin, bottomMargin, rightMargin ) );
}

你能帮我继续这样做吗?

如果你注意到,他们不会移动文本图像。相反,他们只展示了一半。这是简单的图像处理。有关一个很好的示例,请参见。

您可以在纸上绘制图像,并在移动过程中缩放图像。因此,您可以重写JComponent的paintComponent()方法来执行以下操作:

g.drawImage(image, x, y, width, height, null);
x-将是左边距
y-将是最高利润
宽度-将是(maxWidth-leftMargin-rightMargin)
高度-可能是(最大高度-上边距-下边距)


如果您不喜欢缩放图像,则始终可以使用BuffereImage,然后使用getSubImage(…)方法获得所需大小的图像以进行绘制。

只要您不制作Clippy的Swing版本。我会投票决定删除。@glowcoder。。对不起,我不明白你所说的“克里皮摇摆版”是什么意思?哦,那只是个玩笑。Clippy是一个恼人的回形针,总是说“看起来你在试图_____; u___;u__; u__呃。。据我所知,这不是微调器的问题,而是创建预览的逻辑问题。请更新主题accordingly@kleopatra ... 现在已经晚了,但我已经更改了帖子的标题。你说得对。我认为他们确实改变了文本。如果他们在左边插入白色图像,那么起始段落的缩进就不会出现。这似乎很有趣。我目前正在将每个图像放在一个JLabel中。你能给我一个代码示例吗?应用这个也有问题。我想使用小数,比如将上边距更改为0.2英寸,但是drawImage(…)使用int值,因此图像中不会出现任何更改。请参阅教程了解基本信息。您可以使用
drawImage
方法,而不是使用
drawString
方法。第二个注释也与原始方法相关,因为您只能使用像素值来设置标签的位置。因此,无论你做什么,都将是最接近的像素。用户不会注意到差异。我使用了drawImage(…),效果很好。。。谢谢。