JavaをNetbeansで約1年間コーディングしていて、グラフを画面にプロットするデータ操作コードがたくさん書かれています。私は通常、メインウィンドウにJPanelオブジェクトを作り、カスタムペイントコードを書いて、必要に応じてrepaint()メソッドを呼び出します。別のクラスから呼び出されたときにJavaの再描画メソッドが動作しない
しかし、今日、はじめて、パネルを含むクラス(オブジェクト)からパネル上の再描画を呼び出そうとしました。コンパイラはこれに何も問題はなく、デバッグモードでは再ペイントの外部呼び出しに対して適切にシングルステップしましたが、実際に再描画は行われず、コードは実際に再描画メソッドに入りませんでした。
下図のように、私は(それは2つだけ、画面上のパネルを設定するコードが含まれているため、メインが、省略されている。)、問題を実証するためのミニマリストプログラムを書いた
---クラスの説明を、最初の誰もがこのに任意の洞察力を持っている、または回避策を知っている場合は、描画面、他の再描画コール---
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Panel1 extends JComponent
{
GraphPnl graphPnl;
boolean colorFlag;
public Panel1()
{
setLayout(null);
colorFlag = true;
graphPnl = new GraphPnl();
graphPnl.setBounds(10, 10, 110, 110);
graphPnl.setBackground(Color.black);
add(graphPnl);
}//Panel1()
public class GraphPnl extends JPanel
{
//just draws a line segment, toggling color
@Override
public void paint(Graphics g)
{
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
if (colorFlag) {g2.setColor(Color.red);} else {g2.setColor(Color.green);}
g2.drawLine(10, 10, 50, 50);
}//paint
}//GraphPnl
}//Panel1
import javax.swing.*;
import java.awt.event.*;
public class Panel2 extends JComponent
{
JButton testBtn;
TestAction testAction;
Panel1 p1;
public Panel2()
{
p1 = new Panel1();
testBtn = new JButton("Click");
testBtn.setBounds(10, 10, 80, 30);
add(testBtn);
testAction = new TestAction();
testBtn.addActionListener(testAction);
}//Panel2()
public class TestAction implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
p1.colorFlag = ! p1.colorFlag;
p1.graphPnl.repaint();
}
}//TestAction
}//Panel2
が含まれている、私はあなたから を聞いてとても幸せに思います。
ありがとうございました。
ジョンDoner
もちろん、ウィンドウ1のrepaint()メソッドは、ウィンドウ2にフォーカスがある間に機能します。複数のスレッドはこれとは関係がなく、実際にはあなたが望むものと完全に反対です。すべてのSwingの更新はEDTで行う必要があります。あなたが受け入れた答えのあなたのコメントは理にかなっていません。その他の回答では、あなたの問題に対する本当の解決策が得られました(SSCCEをまだ投稿していないので、あなたが提供した制限付きコードに基づいています)。がんばろう。 – camickr