5

その中にJFrame2 つJPanelがあります: a PaintPanel(paint()メソッド付き) と a ButtonPanel(ボタン付き)。の を呼び出すとrepaint()(PaintPanelただし、ボタンをクリックすると) のボタンが!ButtonPanelに描画されます。PaintPanelクリック可能でも何でもなく、ただそこにあります。

このコードで問題を再現しようとしました:

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame("frame");
        frame.setSize(400,400);
        frame.setLayout(new GridLayout(2,1));
        PaintPanel paint = new PaintPanel();
        ButtonPanel buttons = new ButtonPanel(paint);
        frame.add(paint);
        frame.add(buttons);
        frame.setVisible(true);
    }
}

public class PaintPanel extends JPanel{
    public void paint(Graphics g){
        g.drawRect(10, 10, 10, 10);
    }
}

public class ButtonPanel extends JPanel implements ActionListener{

    private PaintPanel paintPanel;

    public ButtonPanel(PaintPanel paintPanel){
        this.paintPanel=paintPanel;
        JButton button = new JButton("button");
        button.addActionListener(this);
        add(button);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        paintPanel.repaint();           
    }
}

これは、私が抱えている問題を再現するものです (奇妙なコード マーキングについては申し訳ありませんが、正しく理解できないようです)。

ここで何が起こっているのか、私にはわからないので、誰かが知っていることを本当に願っています...

4

1 に答える 1

6

まず、 のpaintComponent()代わりにオーバーライドする必要がありますpaint()。これは、パネルのカスタマイズを行う際の Swing のベスト プラクティスの一部です。

次に、これが私のために機能するコードです(なぜあなたのコードが機能しないのかわかりません:S):

public class Main {

    public static void main(String[] args) {

        JFrame frame = new JFrame("frame");
        frame.setSize(400, 400);
        // frame.setLayout(new GridLayout(2, 1));
        PaintPanel paint = new PaintPanel();
        ButtonPanel buttons = new ButtonPanel(paint);
        // frame.add(paint);
        // frame.add(buttons);
        frame.setVisible(true);

        JPanel pan = new JPanel(new BorderLayout());
        pan.add(paint);
        pan.add(buttons, BorderLayout.SOUTH);
        frame.add(pan);

    }
}

class PaintPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(new Color(new Random().nextInt()));
        g.drawRect(10, 10, 10, 10);
    }
}

class ButtonPanel extends JPanel implements ActionListener {

    private final PaintPanel paintPanel;

    public ButtonPanel(PaintPanel paintPanel) {

        this.paintPanel = paintPanel;
        JButton button = new JButton("button");
        button.addActionListener(this);
        add(button);
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        if (getParent() != null) {
            getParent().repaint();
        }
    }
}
于 2012-08-31T20:46:16.187 に答える