是否可以在Java中构建这样的自定义GUI?

时间:2010-01-12 12:54:25

标签: java user-interface

我在Photoshop中制作了这个,我打算将它用于我的文件共享应用程序:

Screenshot

我想知道是否有可能为我的应用程序创建具有这种外观和感觉的GUI。

如果我不能仅使用eclipse或NetBeans构建它,还有其他工具可以帮助我吗?

10 个答案:

答案 0 :(得分:33)

亲爱的,不,不,不!如果您希望用户的眼睛流血,那就去吧。否则,请遵循适合您平台的任何UI准则。

回答你的问题:这在任何现代的窗口系统中都是可行的。

以下是程序员设计UI时通常会发生的事情:

wGetGUI
(来源:jensroesner.de

答案 1 :(得分:18)

不仅可行而且非常简单,您无需一直创建自定义外观。

这是我在20分钟内所做的:

20mins

网上有很多关于如何定制组件的信息,而无需创建一个全新的L& F.

了解Swing Architecture有很大帮助。

如果您还没有阅读,Swing Tutorial就在这里。

最后,您需要文档:Java doc

答案 2 :(得分:9)

您甚至可以动态更改它 - 请参阅摆放的Look-n-Feel feature

答案 3 :(得分:7)

这是可能的。但对于大多数Java开发人员来说,需要在如此丑陋的界面上抑制呕吐反射。

这是我用vi以外的工具编写的Java interface。我没有设计它,我只是采取了艺术家的设计,抓住了我的鼻子,并实施了它。

至于具体细节,我建议通过Swing中的可插拔外观来完成外观和感觉。此外,使用LayoutManagers而不是在恒定的位置使事物大小不变,这样事情就可以增长和缩小到不同的屏幕分辨率,并且如果你翻译的话,你最终不必调整所有文本标签的大小,然后改变一切别的。

答案 4 :(得分:3)

创建新的LaF太多了。由于您的所有JButton都不同,只需使用JButton.setIcon()JButton.setPressedIcon()并使用您的图片即可。其余的是加载背景和使用奇怪的字体。使用Font.createFont()加载自定义字体。您可能需要绘制自己的JProgressbar。覆盖JProgressBar.paintComponent(Graphics g)并绘制自己的图像。

答案 5 :(得分:2)

这很有可能,尽管很多Java Swing开发人员可能不同意图像中的UI。也许是这样。

尽管可以尝试查看JWindowJTableImageIconDimensionJProgressBar。 您还需要充分了解Java布局和事件,例如MouseEventsActionEvents

希望有所帮助。

答案 6 :(得分:1)

您必须创建许多自定义JComponents。除此之外,可能。

答案 7 :(得分:1)

很有可能使用Swing

查看NetBeans GUI Builder

答案 8 :(得分:1)

我会推荐

MiG Layout

用于布局组件,它非常容易掌握,并且比标准布局管理器更强大(并且它也有一个很好的调试模式)。

答案 9 :(得分:0)

我必须不同意您! 实际上,您可以使用 NetBeans 创建这样的 GUI 。 也很容易,您有很多选择可以使用!我个人使用的是:

1) 使用绘画软件创建图形,并将其设置为组件的 Icon 。我用于设计过程 InkScape ,但是任何软件都可以解决问题。在此过程中,您必须格外小心,因为在NetBeans中无法调整图像大小(嗯,我从未尝试过)。

2) 扩展 UI (例如:公共类CustomButtonUI扩展BasicButtonUI),并覆盖方法 paint ,然后使用函数setUI(componentName.setUI(new CustomButtonUI);)

这是示例代码:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.AbstractButton;
import javax.swing.JComponent;
import javax.swing.plaf.basic.BasicButtonUI;

/**
 *
 * @author Ionut Cicio
 */
public class CustomButton extends BasicButtonUI{

    int borderThickness, edgeRoundness;

    @Override
    public void paint(Graphics g, JComponent c) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(c.getBackground());

        borderThickness = 2;
        edgeRoundness = 20;

        g2.setColor(c.getForeground());
        g2.fillRoundRect(0, 0, c.getWidth(), c.getHeight(), edgeRoundness+5, edgeRoundness+5);
        g2.drawRoundRect(0, 0, c.getWidth(), c.getHeight(), edgeRoundness+5, edgeRoundness+5);
        //g2.fillRect(0, 0, c.getWidth(), c.getHeight());
        //g2.drawRect(0, 0, c.getWidth(), c.getHeight());

        g2.setColor(c.getBackground());
        g2.fillRoundRect(borderThickness, borderThickness, c.getWidth()-(int)(borderThickness*2.5), c.getHeight()-(int)(borderThickness*2.5), edgeRoundness, edgeRoundness);
        g2.drawRoundRect(borderThickness, borderThickness, c.getWidth()-(int)(borderThickness*2.5), c.getHeight()-(int)(borderThickness*2.5), edgeRoundness, edgeRoundness);

        super.paint(g, c);
    }

    @Override
    protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect) {

    }
}

总是碰巧同时使用两种方法 ,并且为 动画 给您带来了很大的好处。 strong>!

对于某些 UI (如 BasicTextFieldUI ),了解绘画的工作原理很棘手,但仍然可以理解。