2016-10-21 13 views
-1

このクラスを使用して画像の状態を変えています。最初は、画像は暗いグレーです(見えないので)。私は画像をクリック可能にして、クリックすると数式が現れます。方程式に答えると、完全な画像が表示されます。また、画像を別々に分割する別のクラスもあります。だから基本的には、これらの別々の部分すべてがこのメソッドを継承します。それは別々の画像に分けられた画像です(4つの画像を言いましょう、それで4つの数学の問題を意味します)。私はこれをどうやってやりますか?私は複数の方法を試しましたが(これはラットの巣のように見えるのでこれには含まれていませんが)、それを動作させることはできませんでした。私はmouseListenerOverlayLayoutを実装しようとしましたが、うまく動作しませんでした。画像とパネルをオーバーレイできるようにする必要があります(数式の方程式)

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 
    } 
} 
+0

あなたがの状態を変更するあなたのpaintComponentメソッド内のコードを持っていますオブジェクト、あなたが避けたいものです。なぜなら、このメソッドがいつ呼び出されたか、たとえそれが呼び出されたとしても完全に制御できないからです。代わりに、リッスンする必要のあるイベントに応答してロジックを別の場所に変更し、repaintを呼び出してからpaintComponentを使用して、これらの状態変更の視覚的結果を表示します。 –

+0

@HovercraftFullOfEels あなたはそれが "トグルオン/オフ"と言う場所を指していますか?私の論理は、真実と偽に答える働きをする方法を作ることでした。したがって、現在の 'answers =!responded; // onとoffをトグルし、 'working =!working; // onとoffを切り替えますが、私はmouseListenerをどのように動作させるかわかりません。また、このGPanelクラスで数式パネルをどこに追加するかもわかりません。 – Trey

答えて

1

すべてを行う必要が画像を交換する場合は、そのための最も簡単な方法は、JLabelの内ImageIconsとして画像を表示することです。 JLabelのアイコンを交換するには、JLabelで単にsetIcon(newIcon)を呼び出します。たとえば、アイコンのArrayList(ArrayList<Icon>)内に4つのイメージがあり、このArrayList変数がアイコンと呼ばれ、プログラムに表示されている現在のイメージのインデックス番号を保持するiconIndexというint変数があるとします。索引変数をインクリメントしてイメージを交換し、それを使用してリスト内の次のアイコンを取得することができます。ような何か:

iconIndex++; // increment the index variable 
iconIndex %= icons.size(); // if larger than size of list, set to 0 
Icon icon = icons.get(iconIndex); // get icon from list 
imageLabel.setIcon(icon); // set the JLabel's icon with it 

このコードはのMouseListener内可能性があり、一つはJLabelのに加え、あなたは完了です。ロジックコードはMouseListenerにあることに注意してください。だから、ユーザーが画像を切り替えて前に何かを行う必要がある場合、それは例えば、同じのMouseListener

内でチェックされます。

import java.awt.Color; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class DifferentImages extends JPanel { 
    private static final int IMG_W = 400; 
    private static final int IMG_H = IMG_W; 
    private static final Font TEXT_FONT = new Font(Font.SANS_SERIF, Font.BOLD, 40); 
    private JLabel imageLabel = new JLabel(); 
    private List<Icon> icons = new ArrayList<>(); 
    private int iconIndex = 0; 

    public DifferentImages() { 
     // create images and icons 
     Icon icon = getIcon(Color.DARK_GRAY, Color.LIGHT_GRAY, "First Image");   
     icons.add(icon); 
     icon = getIcon(Color.BLUE, new Color(137, 207, 240), "Second Image"); 
     icons.add(icon); 
     icon = getIcon(Color.RED, Color.PINK, "Third Image"); 
     icons.add(icon); 
     icon = getIcon(Color.YELLOW, Color.ORANGE, "Fourth Image"); 
     icons.add(icon);   

     imageLabel.setIcon(icons.get(iconIndex));   
     add(imageLabel); 

     imageLabel.addMouseListener(new MyMouse()); 
    } 

    // MouseListener that is added to JLabel 
    private class MyMouse extends MouseAdapter { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      // code here to check if it is OK to swap images 
      // and if so, then swap them: 
      iconIndex++; // increment the index variable 
      iconIndex %= icons.size(); // if larger than size of list, set to 0 
      Icon icon = icons.get(iconIndex); // get icon from list 
      imageLabel.setIcon(icon); // set the JLabel's icon with it 
     } 
    } 

    // just creates an image icon for demo purposes, one with color and text 
    private Icon getIcon(Color bg, Color fb, String text) { 
     BufferedImage img = new BufferedImage(IMG_W, IMG_H, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2 = img.createGraphics(); 
     g2.setColor(bg); // first a dark image 
     g2.fillRect(0, 0, IMG_W, IMG_H); 
     g2.setColor(fb); 
     g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     g2.setFont(TEXT_FONT); 
     FontMetrics fontMetrics = g2.getFontMetrics(TEXT_FONT); 
     int textWidth = fontMetrics.stringWidth(text); 
     int x = (IMG_W - textWidth)/2; 
     int y = (IMG_H)/2; 
     g2.drawString(text, x, y); 
     g2.dispose(); 
     Icon icon = new ImageIcon(img); 
     return icon; 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("DifferentImages"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new DifferentImages()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

いいえ、イメージを交換する必要はありません。基本的に、ユーザは画像を選択し、一旦選択されると、その画像は別々の部分に分割される。個々の部分の下には、ユーザーが答えなければならない数学方程式があります。最初は画像が灰色で、それをクリックすると数学の問題が表示されます。問題に正しく答えると、イメージが表示されます。これはすべての質問に答えるまで続き、分割された画像が再び全体として表示されます。 私は混乱のために本当に残念です。私はあなたがコードを書く時間がかかっていることを知っているからです。それは有り難いです。 – Trey

+0

'\t \t addMouseListener(新しいMouseAdapterの(){ \t \t \t公共ボイドのmousePressed(MouseEventの電子){ \t(img.getSource(IF)== E。メソッドgetSourceは()){ \t \tが答え= TRUE。 \t \t working = true; \t \t再描画()。 \t} \t \t \t} \t \t}); '私はうまくいくかもしれないと思ったが、そうでないことです。 – Trey

+0

他のコードでは、JLabelにMouseListenerを追加しています。これはGUIには一度も追加されていません。表示されないため動作しません。 MouseListenerは、表示されたコンポーネントに対してのみ機能します。 –

関連する問題