2017-12-18 17 views
2

アメリカンフットボールの演劇のグラフィック描写を作成するためのグラフィックスエディタのタイプを作成しようとしています。これを行うには、ユーザーが行うことができるはず、次JavaでコンポーネントをドラッグするためのSwingライブラリ

1)

2)変更した画像(丸、四角、およびライン)

3をクリックしてクリックして、左マウスで画像を移動します)すべてのオブジェクトのサイズをリセットする

理想的には、調整可能な色と線の太さを追加できるようにしたいと考えていますが、それは遠い道のりです。

私ができることは、クリックするとイメージを循環するJButtonを作成することだけです。これをJComboBoxに変更して、ユーザーが正しい画像に直進できるようにしたいと考えています。 FBButton

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

@SuppressWarnings("serial") 
public class FBButton extends JButton implements ActionListener { 
    ImageIcon SN, SL, SR, SC, CN, CL, CR, CC, IN; 
    byte value = 0; 
    FBMouseListener listener; 

    public FBButton() { 

     listener = new FBMouseListener(); 

     SN = new ImageIcon(this.getClass().getResource("square_null.png")); 
     SL = new ImageIcon(this.getClass().getResource("square_left.png")); 
     SR = new ImageIcon(this.getClass().getResource("square_right.png")); 
     SC = new ImageIcon(this.getClass().getResource("square_line.png")); 

     CN = new ImageIcon(this.getClass().getResource("circle_null.png")); 
     CL = new ImageIcon(this.getClass().getResource("circle_left.png")); 
     CR = new ImageIcon(this.getClass().getResource("circle_right.png")); 
     CC = new ImageIcon(this.getClass().getResource("circle_line.png")); 

     IN = new ImageIcon(this.getClass().getResource("invisible.png")); 

     addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 
     value++; 
     value %= 9; 

     if (value == 1) { 
      setIcon(SN); 
     } else if (value == 2) { 
      setIcon(SL); 
     } else if (value == 3) { 
      setIcon(SR); 
     } else if (value == 4) { 
      setIcon(SC); 
     } else if (value == 5) { 
      setIcon(CN); 
     } else if (value == 6) { 
      setIcon(CL); 
     } else if (value == 7) { 
      setIcon(CR); 
     } else if (value == 8) { 
      setIcon(CC); 
     } else { 
      setIcon(IN); 
     } 


    } 

} 

これらのボタンが機能し、画像が見つかりました。ここでは、特定の維持の精神でクラスFBPlayerFrame

package swing; 

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

public class FBPlayerFrame extends JFrame { 

    JPanel p = new JPanel(); 
    FBButton buttons[] = new FBButton[22]; 
    String choices[] = { "Hallo", "Bonjour", "Conichuwa" }; 
    JComboBox boxes[]; 
    JComboBox here = new JComboBox(choices); 
    FBComboBox vince; 

    Dimension dim = new Dimension(52, 52); 

    public static void main(String[] args) { 
     new FBPlayerFrame(); 
    } 

    public FBPlayerFrame() { 
     super("Football Start"); 
     setSize(400, 400); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     p.setLayout(null); 


     for (int i = 0; i < 4; i++) { 
      buttons[i] = new FBButton(); 
      buttons[i].setPreferredSize(dim); 
      buttons[i].setLocation(20, 40 + 60 * i); 
      p.add(buttons[i]); 


     } 


     add(p); 

     setVisible(true); 
    } 

} 

のための私のコードは、私が最初に探しています、フレーム全体で、クリックしてドラッグJButtonが、またはJComboBoxesを左に能力があります。ボタンの座標がある時点で保存されていても後で助けになりますが、今は必要ありません。

私はStackOverflowとYouTubeで同様の質問を検索しましたが、私の質問に具体的に答えるものを見つけるのは難しい時間でした。

UPDATE:ここはFBMouseListener

package swing; 

import java.awt.Component; 
import java.awt.Point; 
import java.awt.event.*; 
import javax.swing.event.MouseInputAdapter; 

public class FBMouseListener extends MouseInputAdapter { 
    Point location; 
    MouseEvent pressed; 

    public void mousePressed(MouseEvent me) { 
     pressed = me; 
     System.out.println("Found me"); 
    } 

    public void mouseDragged(MouseEvent me) { 
     Component component = me.getComponent(); 
     location = component.getLocation(location); 
     int x = location.x - pressed.getX() + me.getX(); 
     int y = location.y - pressed.getY() + me.getY(); 
     System.out.println("(" + x + ", " + y + ")"); 
     component.setLocation(x, y); 
    } 
} 
+0

setBoundsとrepaintがあなたを助けることができるはずです。似たようなことをやって、私のボタンを数年前に「ドラッガブル」にすることを覚えています。 – Stultuske

答えて

4

コンポーネントをドラッグするための基本的なコードのために私のコードです:あなたは、クラスの単一のインスタンスを作成し、その後にそれを追加

public class DragListener extends MouseInputAdapter 
{ 
    Point location; 
    MouseEvent pressed; 

    public void mousePressed(MouseEvent me) 
    { 
     pressed = me; 
    } 

    public void mouseDragged(MouseEvent me) 
    { 
     Component component = me.getComponent(); 
     location = component.getLocation(location); 
     int x = location.x - pressed.getX() + me.getX(); 
     int y = location.y - pressed.getY() + me.getY(); 
     component.setLocation(x, y); 
    } 
} 

ドラッグしたいコンポーネント。

Component Moverクラスをチェックアウトすることもできます。デスクトップ上のウィンドウやパネル内のコンポーネントをドラッグすることができます。それはいくつかのドラッグ機能を提供します。

編集:

それは、このソリューションをテストするためのコードの行のカップル私を取る:

JButton button = new JButton("hello"); 
button.setSize(button.getPreferredSize()); 

DragListener drag = new DragListener(); 
button.addMouseListener(drag); 
button.addMouseMotionListener(drag); 

JPanel panel = new JPanel(null); 
panel.add(button); 

JFrame frame = new JFrame(); 
frame.add(panel); 
frame.setSize(400, 400); 
frame.setVisible(true); 

は、main()メソッドでは、上記のコードを入れて、あなたがテストするための簡単なコードを持っています。

+0

私はかなりJavaに新しいです。私は通常C言語でコーディングしていますが、OOPはまだかなり新しいものです。実際、これは洗練されたコードでの私の最初の試みの一つです。 FBDragListenerという新しいクラスを作成し、コードをコピーしました。次に、FBButtonの内部に ... FBDragListener listener' 'public FBButton(){' 'listener = new FBDragListener()'のような新しい行を追加しました。 これはボタンを動かすことができると思いました。エラーは発生していませんが、プログラムは同じように機能しているようです[ボタンはそこにありクリック可能ですが、移動できません]。 – MDR

+0

提供されたリンクを読んだことがありますか?リスナーをボタンに追加しましたか?あなたのパネルはヌルレイアウトを使用していますか? – camickr

+0

私はリンクを読みました、そのツールをありがとうございます。私はまだそれを合成しようとしていますが、私のためにそれを調達していただきありがとうございます。 リスナーをボタンに追加し、Jpanel 'p'を' p.setLayout(null) 'に変更しました。奇妙なのは、ボタンにsetLocation()を使用していても、私のボタンがまったく表示されていないことです。 質問を編集して、更新されたコードを反映させます。 – MDR

関連する問題