2

私は2つで構成されるフレームを持っています JPanels

Panel1ボタンが含まれています。ボタンをクリックすると、panel2の色が変更されて赤くなりますが、これは起こりませんでした

パネルの色を別のパネルから変更する方法に関するヘルプと説明

 public class MyForm extends JFrame {
            public MyForm() {
    // TODO Auto-generated constructor stub
    super();
    // setLayout(new FlowLayout());
    Panel1 panel1 = new Panel1();
    add(panel1, BorderLayout.NORTH);

    Panel2 panel2 = new Panel2();
    add(panel2, BorderLayout.CENTER);
}

class Panel1 extends JPanel {

    public Panel1() {
        // TODO Auto-generated constructor stub

        JButton btn = new JButton("Change Color");
        add(btn);
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                System.out.println("Sqsq");
                Panel2 panel2 = new Panel2();
                panel2.setBackground(Color.red);
                panel2.repaint();

            }
        });
    }
}

class Panel2 extends JPanel {
    public Panel2() {
        // TODO Auto-generated constructor stub
        super();
        setBackground(Color.black);

    }

    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponent(g);
    }
}

public static void main(String[] args) {
    MyForm form = new MyForm();
    // form.setLocationRelativeTo(null);
    form.setSize(500, 500);
    form.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    form.setVisible(true);

}
 }
4

1 に答える 1

6

まず、あなたbtn actionPerformedのメソッドでは、フレームに追加されたものと同じ参照ではない新しいものを作成しているため、何も変わりません... Panel2

Panel1更新したいコンポーネントを渡して参照する必要があります...

class Panel1 extends JPanel {

    private JComponent changeMe;

    public Panel1(JComponent changeMe) {
        this.changeMe = changeMe;
        // TODO Auto-generated constructor stub

        JButton btn = new JButton("Change Color");
        add(btn);
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                System.out.println("Sqsq");
                if (changeMe != null) {
                    changeMe.setBackground(Color.red);
                    changeMe.repaint();
                }

            }
        });
    }
}

代わりに、親コンテナーを再描画するように要求する必要があるかもしれませんが、これがどのように行われるかを見てください...

于 2012-10-14T08:31:45.463 に答える