2

私はJavaSwingを初めて使用しますが、を更新するのに奇妙な問題がありますJPanel

フレームに静的コンポーネントを作成し、JPanelから静的メソッドを呼び出してFileListennerJPanel

 public static void repaintPlan(JPanel f) {
    f.paint(f.getGraphics()); 
    f.revalidate(); // or validate
}

つまり、ファイルコンテンツの変更を検出すると、新しい座標を計算して再描画します( paintComponent() `メソッドJPanelからクラスexendsを作成します)JPanel to define

アプリを実行するとすべてが正常に機能し、ファイル内のデータを変更すると再描画が機能します。しかし、でマウスをクリックするとJpanel、このrepaint()メソッドは機能しなくなります。JPanelをクリックした後、塗り直しが機能しない理由を教えてください。

私の悪い英語でごめんなさい事前に感謝します:)

編集:あなたの応答をありがとう!しかし、私がrepaint()方法を使っても、それは同じ問題です。をクリックするとどうなるかを理解しようとしていますJPanel。問題を解決するには、Swingでマウスイベントを使用する必要がありますか?

4

4 に答える 4

7

1) SwingJComponentsには method がありpaintComponent()、 methodpaint()は最上位コンテナ ( JFrame、JDialog ...) 用であり、AWT Components

2) を呼び出した後に期限切れになっgetGraphics()たスナップショットを作成したこのメソッドを使用しないでください。validaterevalidaterepaint

3) 2D グラフィックスに関するチュートリアルをご覧になりました。例はこちら

4) 本当の質問がある場合は、SSCCEで質問を編集してください。

于 2012-04-28T13:20:54.103 に答える
4

をクリックすると何が起こるか理解しようとしていますJPanel。問題を解決するには、Swing でマウス イベントを使用する必要がありますか?

マウスが押されたイベントに応答するこの例から、いくつかの洞察が得られるかもしれません。この場合、paintComponent()色が更新されると自動的に呼び出されます。AWT および Swing でのペイントも参照してください。

于 2012-04-28T14:09:38.300 に答える
3

いいえ、ペイントコンポーネントは、マウスを押した後に呼び出されることはありません。これを行うコードがない限り、呼び出されません。例えば:

import java.awt.*;
import javax.swing.*;

public class MyPanel extends JPanel {
   private static final int PREF_W = 400;
   private static final int PREF_H = 400;

   public MyPanel() {
      setBorder(BorderFactory.createTitledBorder("My Panel"));
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);

      System.out.println("myPanel's paintComponent method has been called");
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGui() {
      MyPanel mainPanel = new MyPanel();

      JFrame frame = new JFrame("MyPanel");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

明らかなように、通常の JPanel では、GUI のサイズを変更しない限り、マウス操作の後で paintComponent は呼び出されません。

GUI に何か他の問題があります。また、プログラム ロジックはこのメソッドが呼び出されるかどうかに依存しないため、paintComponent が 1 回呼び出されるか複数回呼び出されるかは問題ではありません。

于 2012-04-28T21:25:57.797 に答える
0

このようにJPanelのマウスイベントメソッドをオーバーライドすることで問題を解決します

 myJPanel.addMouseListener(new MouseListener() {

        public void mouseReleased(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        public void mousePressed(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        public void mouseExited(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        public void mouseEntered(MouseEvent e) {
            // TODO Auto-generated method stub

        }

        public void mouseClicked(MouseEvent e) {
            // TODO Auto-generated method stub

        }
    });

ありがとう

于 2012-04-28T18:14:50.760 に答える