このクラスを使用して画像の状態を変えています。最初は、画像は暗いグレーです(見えないので)。私は画像をクリック可能にして、クリックすると数式が現れます。方程式に答えると、完全な画像が表示されます。また、画像を別々に分割する別のクラスもあります。だから基本的には、これらの別々の部分すべてがこのメソッドを継承します。それは別々の画像に分けられた画像です(4つの画像を言いましょう、それで4つの数学の問題を意味します)。私はこれをどうやってやりますか?私は複数の方法を試しましたが(これはラットの巣のように見えるのでこれには含まれていませんが)、それを動作させることはできませんでした。私はmouseListener
とOverlayLayout
を実装しようとしましたが、うまく動作しませんでした。画像とパネルをオーバーレイできるようにする必要があります(数式の方程式)
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
* Makes the image have different states
*/
public class GPanel extends JPanel {
private Image img;
private boolean answered;
private boolean working;
private int w;
private int h;
/**
*
*/
private static final long serialVersionUID = 1L;
public GPanel(Image img) {
this.img = img;
w = img.getWidth(this);
h = img.getHeight(this);
setPreferredSize(new Dimension(w, h));
answered = false;
working = false;
}
public void setAnswered() {
answered = true;
}
public boolean getAnswered() {
return answered;
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
if (!answered) {
if (working){
System.out.println("Run third");
g2.setColor(Color.lightGray);
g2.fillRect(0, 0, w, h);
g2.setPaint(Color.yellow);
g2.setFont(new Font("Sans-serif", Font.BOLD, 20));
g2.drawString("Testing, one, two, three.", w/3, h/2);
((JFrame)SwingUtilities.getRoot(this)).setTitle("Testing, one, two, three.");
}
else{
System.out.println("Run first");
g2.setColor(Color.darkGray);
g2.fillRect(0, 0, w, h);
}
working = !working; // toggles on and off
} else {
System.out.println("Run second");
g2.drawImage(img, 0, 0, this);
((JFrame)SwingUtilities.getRoot(this)).setTitle("Testing GPanel");
}
answered = !answered; // toggles on and off
}
}
あなたがの状態を変更するあなたのpaintComponentメソッド内のコードを持っていますオブジェクト、あなたが避けたいものです。なぜなら、このメソッドがいつ呼び出されたか、たとえそれが呼び出されたとしても完全に制御できないからです。代わりに、リッスンする必要のあるイベントに応答してロジックを別の場所に変更し、repaintを呼び出してからpaintComponentを使用して、これらの状態変更の視覚的結果を表示します。 –
@HovercraftFullOfEels あなたはそれが "トグルオン/オフ"と言う場所を指していますか?私の論理は、真実と偽に答える働きをする方法を作ることでした。したがって、現在の 'answers =!responded; // onとoffをトグルし、 'working =!working; // onとoffを切り替えますが、私はmouseListenerをどのように動作させるかわかりません。また、このGPanelクラスで数式パネルをどこに追加するかもわかりません。 – Trey