java - 如何在另一个 JComponent 上添加半透明的 JPanel

标签 java swing

我正在尝试向应用添加功能。我的目标是用一个半透明的 JPanel(它将在中间包含一个 JXBusyLabel)覆盖一个 JComponent of the JFrame。

假设我们有这样的事情:

img1

点击我们希望有以下JPanel,但是是半透明的(这意味着它应该允许或多或少地看到它背后的内容):

img2

我尝试使用 glassPane 失败。 任何有关如何实现此目的的建议将不胜感激。 另外,我注意到 JXBusyLabel 的背景不同,如果它的工作方式与半透明 jpanel 背景相同,那就太好了。 锦上添花的是将加载轮放在那个 jpanel 的中间。

我们会在解决每个问题后立即更新下面的代码。 任何关于如何实现这一目标的建议将不胜感激。

这里是有意编写的示例代码:

public class Main {


    public static void main(String[] args)  {       
        SwingUtilities.invokeLater(new TestApp());      
    }

}

class TestApp implements Runnable {
    @Override
    public void run(){  
        JFrame mainWindow = new JFrame("MyFrame");
        mainWindow.setLayout(new BorderLayout());
        mainWindow.setMinimumSize(new Dimension(300,300));

//      mainWindow.add(initView(),BorderLayout.CENTER);
      mainWindow.add(initLoadingPanel(),BorderLayout.CENTER);
        mainWindow.add(initButton(),BorderLayout.PAGE_END);

        mainWindow.setVisible(true);
    }

    private JPanel initView() {
        JPanel viewPort = new JPanel();
        viewPort.setLayout(new BoxLayout(viewPort, BoxLayout.Y_AXIS));
        viewPort.add(new JLabel("label 1"));
        viewPort.add(new JLabel("label 2"));
        viewPort.add(new JLabel("label 3"));
        viewPort.add(new JLabel("label ..."));
        viewPort.add(new JLabel("label N"));
        return viewPort;
    }

    private JPanel initLoadingPanel() {
        JPanel trasparentPanel = new JPanel();
        trasparentPanel.setOpaque(true);
        trasparentPanel.setBackground(new Color(200,230,250,100));
        trasparentPanel.add(initLoadingWheel());
        return trasparentPanel;
    }

    private Component initLoadingWheel() {
        JXBusyLabel loadingWheel = new JXBusyLabel(new Dimension(80,80));
        loadingWheel.setBackground(new Color(200,230,250,100));
        loadingWheel.setOpaque(true);
        loadingWheel.setBusy(true);
        return loadingWheel;
    }

    private JButton initButton() {
        JButton button = new JButton("Start & Stop Loading");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
        return button;
    }
}

最佳答案

I tried unsuccesfully to use the glassPane

对我来说效果很好。阅读 Root Panes 上的 Swing 教程并下载工作示例。发布演示问题的 SSCCE

您还可以查看 Disabled Glass Pane对于一个简单的 API。当前代码仅显示文本,但您可以轻松修改类以显示图像,因为代码仅使用 JLabel 作为文本。

你也可以使用 JLayer装饰您的面板。

关于java - 如何在另一个 JComponent 上添加半透明的 JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34515310/

相关文章:

java - JOptionPane.showOptionDialog 不显示按钮?

java - IntelliJ 无法识别 Lombok 方法但编译成功

java - OkHTTP (v3.0.0-RC1) 带参数的 Post 请求

java - Swing 应用程序中的依赖注入(inject)

Java弹出菜单监听项目点击?

java - ClassCastException : javax. Swing .JButton

java - 为什么我必须重新调整 JFrame 的大小才能看到该组件

java - 基于控制台的应用程序到 Java 中基于 GUI 的应用程序

java - 带数组列表的 NumberPicker

java - 复选框不显示