2

私は Java で単純なペイント アプリケーションに取り組んでいますが、Swing は協力したくありません。最初に、設定パネルを保持する JTabbedPane を作成しようとしましたDrawAreaが、いくつかの奇妙な理由で 2 番目mouseDragged()(および拡張により drawArea.repaint() メソッド) がトリガーされ、JTabbedPane が複製されたように見えました。垂直に積み重ねられた 2 つの同一のタブ ペインを想像してみてください。これは JTabbedPane の単なるバグだと思っていましたが、パネルで JButton を使用して非常に単純なカスタム メニューにすべてを書き直したところ、まったく同じことが起こりました。GUI が実際に上部領域を複製したわけではありません。使い物にならないので、上にペイントできます。見てみな: ここに画像の説明を入力

編集:同様の質問が見つかりました。super.paintComponent(g) を呼び出すと、問題は解決します (drawArea.setBackground(color) は実際に機能します!) が、呼び出された関数super(私にとっては新しいキーワード) は基本的に drawArea を再描画するため、ペイント トレイルは保存されなくなります。 .

drawArea を埋めるために四角形をペイントすると、mouseDragged がまだ起動されていても問題が上書きされます。レンダリング コードは次のとおりです。

@Override
public void mouseDragged(MouseEvent e) {
    x = e.getX(); y = e.getY();
    drawArea.repaint();
}

// (subclass):
class DrawArea extends JPanel {
    public void paintComponent(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillOval(x-3, y-3, 7, 7);
    }
}

GUIコードは次のとおりです。

    frame = new JFrame("Jadra");
    frame.setSize(650, 600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    menu = new JPanel();

    settingsButton = new JButton("Settings");
    clearButton = new JButton("Clear");
    exitButton = new JButton("Quit");

    menu.setLayout(new FlowLayout());
    menu.add(settingsButton);
    menu.add(clearButton);
    menu.add(exitButton);
    menu.setBackground(new Color(30, 90, 60));

    drawArea = new DrawArea();
    drawArea.setBackground(Color.red);
    drawArea.setOpaque(true);
    drawArea.addMouseMotionListener(this);

    frame.getContentPane().add(menu, BorderLayout.NORTH);
    frame.getContentPane().add(drawArea, BorderLayout.CENTER);

    Thread pt = new Thread(new Painter());
    frame.setVisible(true);
    pt.start();

私が本当にばかげたことをしたことを教えてください。そうでなければ、これは本当に迷惑なバグのように見えます。本当にありがとうございました。ありがとう!

4

1 に答える 1

4

デフォルトの描画が行われるようにするには、オーバーライドDrawPanel.paintComponent()元のメソッドまでメソッドを連鎖させる必要があります。JPanel追加するだけ

super.paintComponent(g);

このメソッドの最初の行として。

于 2012-12-08T01:02:58.247 に答える