-1

必ずしも重複した質問ではありません

パネルを透明に設定しようとしています。ただし、私の「アプリ」はより大きなアプリケーションの一部であり、パネルが「何」に含まれているかを調べる必要があります。

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());         
    }
});
4

1 に答える 1

3

問題は、実際に何かに追加される前に、親を見つけようとしているように見えることです。コンストラクター内で親を探すことはできません。コンストラクターが戻るまで、コンポーネントを何かに追加する方法がないためです。たとえば...

add(new HelloWorldModule());

HelloWorldModule何かに追加できるようになる前に、初期化/コンストラクターを作成する必要があります

より良い解決策は、 を使用HierarchyListenerして親イベントへの変更を監視するか、 を使用PropertyChangeListenerしてプロパティへの変更を監視するか、コンポーネントがコンテナーに追加されたときに呼び出される をparentオーバーライドすることです。addNotify

あなたがする必要があるのは、そうであるかどうかを確認することgetParentですnull。そうでない場合はSwingUtilities.getWindowAncestor、親ウィンドウを見つけるかSwingUtilities.getRootPane、ルート ペインを取得するか、またはその他必要なものを取得できます。

追加するかもしれませんが、これは悪いデザインの悪臭を放ちます。子コンポーネントは気にするべきではなく、その親コン​​テナを制御しようとするべきでもありません - IMHO

于 2013-11-09T10:55:02.953 に答える