如何创建专业定制的JavaSwingGUI?

如何创建专业定制的JavaSwingGUI?,java,swing,user-interface,graphics,Java,Swing,User Interface,Graphics,最近,我的任务是完全修改我公司的一个软件Gui外观。 到目前为止,我只做了基本的外观变化。主要是通过一些GridBagConstraints处理将Gui从默认的Metal L&F升级到System L&F。 但这项任务有所不同: 我们有一位平面设计师,他绘制了所需的设计: 我知道如何创建这种功能。我可能会使用双JTabbedPanes,或者只是在四周添加JPanel 我的问题是如何将图形与gui对象结合起来。 我应该要求设计师给我什么,以使Java Swing应用程序看起来像这样——具有圆形选

最近,我的任务是完全修改我公司的一个软件Gui外观。 到目前为止,我只做了基本的外观变化。主要是通过一些GridBagConstraints处理将Gui从默认的Metal L&F升级到System L&F。 但这项任务有所不同:

我们有一位平面设计师,他绘制了所需的设计:

我知道如何创建这种功能。我可能会使用双JTabbedPanes,或者只是在四周添加JPanel

我的问题是如何将图形与gui对象结合起来。 我应该要求设计师给我什么,以使Java Swing应用程序看起来像这样——具有圆形选项卡和合并的选项卡面板颜色?
当我现在得到的只是上面的这张图纸时,我怎么能让JPanel或JTabbedPanes穿上这种奇特的服装呢?

大多数定制的Swing GUI都是使用带有图像图标和自定义处理代码的JLabel制作的。例如:

public class CustomGUI extends JFrame {

private JLabel frame, border, grip, exit, minimize;
private Point initialClick;

public CustomGUI() {
    initComponents();
}

private void initComponents() {
    setTitle("CustomGUI");
    setMinimumSize(new Dimension(640, 480));
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setUndecorated(true);
    setBackground(new Color(0, 0, 0, 0));
    setLayout(null);
    pack();

    frame = new JLabel();
    frame.setBounds(0, 0, 640, 480);
    frame.setIcon(new ImageIcon(getClass().getResource("frame.png"));

    border = new JLabel();
    border.setBounds(0, 0, 640, 480);
    border.setIcon(new ImageIcon(getClass().getResource("border.png"));

    grip = new JLabel();
    grip.setBounds(215, 0, 376, 25);
    grip.setIcon(new ImageIcon(getClass().getResource("grip.png"));
    grip.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent evt) {
            initialClick = evt.getPoint();
        }
    });
    grip.addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(MouseEvent evt) {
            int thisX = getLocation().x;
            int thisY = getLocation().y;
            int xMoved = (thisX + evt.getX()) - (thisX + initialClick.x);
            int yMoved = (thisY + evt.getY()) - (thisY + initialClick.y);
            int posX = thisX + xMoved;
            int posY = thisY + yMoved;
            setLocation(posX, posY);
        }
    });

    exit = new JLabel();
    exit.setBounds(620, 4, 32, 16);
    exit.setIcon(new ImageIcon(getClass().getResource("exit.png"));
    exit.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent evt) {
            dispatchEvent(new WindowEvent(new UI(), WindowEvent.WINDOW_CLOSING));
        }
        @Override
        public void mouseEntered(MouseEvent evt) {
            exit.setIcon(new ImageIcon(getClass().getResource("exitGlow.png"));
        }
        @Override
        public void mouseExited(MouseEvent evt) {
            exit.setIcon(new ImageIcon(getClass().getResource("exit.png"));
        }
    });

    minimize = new JLabel();
    minimize.setBounds(600, 4, 16, 16);
    minmize.setIcon(new ImageIcon(getClass().getResource("minimize.png"));
    minimize.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent evt) {
            setState(Frame.ICONIFIED);
        }
        @Override
        public void mouseEntered(MouseEvent evt) {
            minimize.setIcon(new ImageIcon(getClass().getResource("minimizeGlow.png"));
        }
        @Override
        public void mouseExited(MouseEvent evt) {
            minimize.setIcon(new ImageIcon(getClass().getResource("minimize.png"));
        }
    });

    add(minimize);
    add(exit);
    add(grip);
    add(border);
    add(frame);
}

public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
        new CustomGUI().setVisible(true);
    });
}
}
这段代码创建了一个自定义GUI,带有自定义框架、边框和用于拖动窗口的夹点,包括退出和最小化按钮,当鼠标进入这些按钮时,这些按钮会发光,使它们看起来很专业。(每个组件的图像需要位于项目的根目录中,才能正常工作。)如果要创建自定义选项卡式窗格,请使用
ImageIcons
创建
jlabel
,这些图标看起来像圆形选项卡或任何您希望它们看起来像的图标,每个图标上都有相应的文本,并添加处理,通过更改其颜色或在其周围添加边框使其看起来被选中,并将其相应的面板置于前面,隐藏所有其他面板

或者,您也可以这样做,但这很难做到,并且没有给您使用
JLabels
ImageIcons
的自由


您也可以使用一个旨在取代Swing的丰富GUI平台,但就Swing而言,上述代码是您使用Swing应用程序的最佳选择。

也许可以使用javaFX实现这一点?看看其他可能满足您需要的外观和感觉。还考虑看合成的外观和感觉,它允许你去皮肤元素而不需要完全重写外观和感觉……最后我把整个屏幕分割成不同矩形的网。我把这张图表交给了平面设计师,她给我提供了屏幕的所有部分,我把它们放在JPanels上,用GridBagLayout连接在一起。然后我覆盖了需要操作的特定JPanel的鼠标侦听器,屏幕也准备好了。谢谢你详细的回答。正如您所建议的,我最终在jpanel之上使用jlabel和鼠标侦听器。