【问题标题】:java need to find "parent container" to setBackground transparentjava需要找到“父容器”来设置背景透明
【发布时间】:2013-11-09 10:05:05
【问题描述】:

不一定是重复的问题

我正在尝试将我的面板设置为透明。但是,我的“应用程序”是一个更大的应用程序的一部分,我需要找出“什么”包含我的面板。

getRoot() gives a null pointer.

这可行,但让一切变得透明 - 有没有办法判断哪个是我的父容器?

    JFrame.setDefaultLookAndFeelDecorated(true);
    Frame[] Frs = JFrame.getFrames();
    int n=-1;
    for (Frame f : Frs) {
        f.setOpacity(0.55f);

}

我不确定我的父母是框架还是面板。

有没有办法说“我包含在什么里面?”

EDIT1

我知道有类似的问题有答案,但它们似乎对我不起作用。我也试过这个:

Container c = SwingUtilities.getAncestorOfClass(getClass(), this);
JOptionPane.showMessageDialog(null,"Container "+ c.getName());

我又得到一个空指针

完整代码

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


import javax.swing.JLabel;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;

public class HelloWorldModule extends JPanel implements WorkspaceModule{


    private static final long serialVersionUID = 1L; //change this number to something more sensible
    private JLabel lblHelloWorld;

    public HelloWorldModule() {
        setLayout(null);
        setSize(647, 623);
        setPreferredSize(new Dimension(900, 840));
        this.setOpaque(true);
        JFrame.setDefaultLookAndFeelDecorated(true);
        try {
            this.setBackground(new java.awt.Color(150,50,50,100));
            Container c = SwingUtilities.getAncestorOfClass(this.getClass(), this);
            JOptionPane.showMessageDialog(null,"Container "+ c.getName());
            //this. setBackground(new java.awt.Color(150,50,50,100));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            JOptionPane.showMessageDialog(null,"Factory "+ e);
        }

        lblHelloWorld = new JLabel("HelloWorld");
        lblHelloWorld.setBounds(33, 53, 78, 28);
        add(lblHelloWorld);

        setModuleTitle("Hello world!");



    }

    @Override
    public JComponent getVisualComponent() {
        return this;
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public PersistedStateHolder getPersistedState() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void loadPersistedState(PersistedStateHolder state) {
        // TODO Auto-generated method stub

    }


    protected void setModuleTitle(String title) {
        putClientProperty(WorkspaceModuleProperties.COMPONENT_TITLE, title);
    }

}

EDIT2

JButton b = new JButton();
b.setVisible(true);
b.setOpaque(true);
b.setText("PRESS");
b.setPreferredSize(new Dimension(100,100));
b.addActionListener(new ActionListener() {


    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        Container c = SwingUtilities.getAncestorOfClass(P.getClass(), P);
        JOptionPane.showMessageDialog(null,"Container " + c.getName());         
    }
});

【问题讨论】:

标签: java swing transparency


【解决方案1】:

问题是,你似乎试图在你的父母真正被添加到任何东西之前找到它。在构造函数中寻找你的父对象是行不通的,因为在构造函数返回之前,组件不可能被添加到任何东西中,例如......

add(new HelloWorldModule());

HelloWorldModule 必须先初始化/构造函数,然后才能添加到任何东西

更好的解决方案可能是使用HierarchyListener 来监视父事件的更改或使用PropertyChangeListener 来监视parent 属性的更改,或者您可以覆盖addNotify,它在组件时调用被添加到容器中。

您需要做的是检查getParent 是否为null。如果没有,您可以通过SwingUtilities.getWindowAncestor 查找父窗口或SwingUtilities.getRootPane 获取根窗格....或者您还需要什么

我可能会补充,这很糟糕的设计。子组件不应该关心,也不应该尝试控制它的父容器 - 恕我直言

【讨论】:

  • 是的——你可能对糟糕的设计是正确的!你知道我可以让我的面板透明的任何其他方法吗?
  • 参见编辑 2。我添加了一个按钮。但是当我按下按钮时,我仍然得到一个 c 的空指针。
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 2016-10-09
  • 1970-01-01
  • 2012-07-27
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多