web-dev-qa-db-ja.com

JavaのボタンクリックでJPanelに線を引く

JPanelで線を引きたい。これは私のGUIで、JPanelに白の線が必要です。

enter image description here

多くの例を見つけましたが、問題はそれの使い方です。

多くの例では、常にJPanelから拡張されたJFrameで描画します。

パネルをフレームに追加し、いくつかのボタンを追加して多方向に線を描画し、中央のXボタンを使用してJPanelをクリーンアップします。

これはインターフェースのコードです:

import Java.awt.BorderLayout;
import Java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import Java.awt.Color;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import Java.awt.event.MouseAdapter;
import Java.awt.event.MouseEvent;


public class circuit extends JFrame {

 private JPanel contentPane;

 /**
  * Launch the application.
  */
 public static void main(String[] args) {
  EventQueue.invokeLater(new Runnable() {
   public void run() {
    try {
     circuit frame = new circuit();
     frame.setVisible(true);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  });
 }

 /**
  * Create the frame.
  */
 public circuit() {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  setBounds(100, 100, 559, 332);
  contentPane = new JPanel();
  contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  setContentPane(contentPane);
  contentPane.setLayout(null);

  JScrollPane scrollPane = new JScrollPane();
  scrollPane.setBounds(10, 21, 359, 255);
  contentPane.add(scrollPane);

  JPanel panel = new JPanel();
  scrollPane.setViewportView(panel);
  panel.setBackground(Color.WHITE);

  JLabel label = new JLabel("New label");
  label.addMouseListener(new MouseAdapter() {
   @Override
   public void mouseClicked(MouseEvent arg0) {


    /////////////


   }
  });
  label.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\up.png"));
  label.setBounds(447, 66, 46, 48);
  contentPane.add(label);

  JLabel label_1 = new JLabel("New label");
  label_1.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\down.png"));
  label_1.setBounds(447, 159, 46, 48);
  contentPane.add(label_1);

  JLabel label_2 = new JLabel("New label");
  label_2.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\right.png"));
  label_2.setBounds(495, 112, 46, 48);
  contentPane.add(label_2);

  JLabel label_3 = new JLabel("New label");
  label_3.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\left.png"));
  label_3.setBounds(398, 112, 46, 48);
  contentPane.add(label_3);

  JLabel label_4 = new JLabel("New label");
  label_4.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\1303860240_list-remove.png"));
  label_4.setBounds(447, 112, 46, 48);
  contentPane.add(label_4);
 }
}

これは線を引くためのコードです

public void Paint(Graphics graphics)
{
    graphics.drawLine(10, 20, 300, 310);
}

したがって、この行の使用方法....

前もって感謝します。

宜しくお願いします、

ALi

19

次の方法を使用すると、線を描くほうが簡単な場合があります。

  1. クリックして最初の端点をマークします
  2. ドラッグして進行中の行を表示します
  3. 2番目のエンドポイントをマークするリリース

この関連 は、追加のガイダンスを提供する場合があります。

補遺

  1. 以下の例は、上記の概要を実装しています。
  2. ボタンのパネルを使用して描画に影響を与える方法を示すために、例を更新しました。
  3. キーバインディングでActionインターフェイスを使用するこの関連 example も参照してください。
  4. Key Bindings を使用するようにこの例を更新しました。

LinePanel.Java

import Java.awt.BasicStroke;
import Java.awt.BorderLayout;
import Java.awt.Color;
import Java.awt.Dimension;
import Java.awt.EventQueue;
import Java.awt.Graphics;
import Java.awt.Graphics2D;
import Java.awt.Point;
import Java.awt.RenderingHints;
import Java.awt.event.ActionEvent;
import Java.awt.event.KeyEvent;
import Java.awt.event.MouseAdapter;
import Java.awt.event.MouseEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

/**
 * @see https://stackoverflow.com/questions/6991648
 * @see https://stackoverflow.com/questions/6887296
 * @see https://stackoverflow.com/questions/5797965
 */
public class LinePanel extends JPanel {

    private MouseHandler mouseHandler = new MouseHandler();
    private Point p1 = new Point(100, 100);
    private Point p2 = new Point(540, 380);
    private boolean drawing;

    public LinePanel() {
        this.setPreferredSize(new Dimension(640, 480));
        this.addMouseListener(mouseHandler);
        this.addMouseMotionListener(mouseHandler);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.blue);
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setStroke(new BasicStroke(8,
            BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
        g.drawLine(p1.x, p1.y, p2.x, p2.y);
    }

    private class MouseHandler extends MouseAdapter {

        @Override
        public void mousePressed(MouseEvent e) {
            drawing = true;
            p1 = e.getPoint();
            p2 = p1;
            repaint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            drawing = false;
            p2 = e.getPoint();
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            if (drawing) {
                p2 = e.getPoint();
                repaint();
            }
        }
    }

    private class ControlPanel extends JPanel {

        private static final int DELTA = 10;

        public ControlPanel() {
            this.add(new MoveButton("\u2190", KeyEvent.VK_LEFT, -DELTA, 0));
            this.add(new MoveButton("\u2191", KeyEvent.VK_UP, 0, -DELTA));
            this.add(new MoveButton("\u2192", KeyEvent.VK_RIGHT, DELTA, 0));
            this.add(new MoveButton("\u2193", KeyEvent.VK_DOWN, 0, DELTA));
        }

        private class MoveButton extends JButton {

            KeyStroke k;
            int dx, dy;

            public MoveButton(String name, int code,
                    final int dx, final int dy) {
                super(name);
                this.k = KeyStroke.getKeyStroke(code, 0);
                this.dx = dx;
                this.dy = dy;
                this.setAction(new AbstractAction(this.getText()) {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        LinePanel.this.p1.translate(dx, dy);
                        LinePanel.this.p2.translate(dx, dy);
                        LinePanel.this.repaint();
                    }
                });
                ControlPanel.this.getInputMap(WHEN_IN_FOCUSED_WINDOW)
                    .put(k, k.toString());
                ControlPanel.this.getActionMap()
                    .put(k.toString(), new AbstractAction() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        MoveButton.this.doClick();
                    }
                });
            }
        }
    }

    private void display() {
        JFrame f = new JFrame("LinePanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.add(new ControlPanel(), BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new LinePanel().display();
            }
        });
    }
}
22
trashgod

これはスケッチのように機能しますか?次に、ポイントの現在の位置を追跡する必要があります。

   Point current = new Point(0, 0); //for example.

次に、ユーザーがボタンをクリックすると、それに応じて単にxとyを増減できます。

左矢印:

   current.setX(current.getX() - INC);

ここで、INCは、線を引く距離の長さを指定する変数です。たぶん5?ただし、常に2番目の点p1を前の位置に設定します。

JFrameに直接描画するよりも、CanvasまたはJPanelを拡張して描画するクラスを作成する方が常に簡単です。

例えば.

public class Circuit extends JFrame {
  Point p1, current;

  JPanel drawPanel;

  //your other declarations

  public Circuit(){
         super();
         drawPanel = new DrawPanel();
         p1 = new Point(0, 0);
         current = new Point(0, 0);
         add(drawPanel, BorderLayout.CENTER);
         //your other code
  }

  class DrawingPanel extends JPanel{

        public void paintComponent(Graphics g){
             g.drawLine(p1.getX(), p1.getY(), current.getX(), current.getY());
        }
  }


   //the rest of your code.
}
7

グラフィックスをトリガーするための簡単な答えがあります。次のコードは、クリックイベント内に配置して、jPanelにいくつかの単純なオブジェクトを描画するために使用できます。この場合のjPanel1は、タブ付きのjPanel7の片側にあり、トリガーボタンの隣にありました。これをnetbeans GUIで行うために、コードはボタンアクションイベント内に配置されました。適切なインポートがないという通常のエラーが表示されたら、コードを右クリックして[インポートの修正]をクリックします。ビンゴ、すべて順調です:-)警告:パネルのsetBackgroundコマンドは、グラフィックスオブジェクトをオーバーライドします。グラフィックスオブジェクトを使用せずに背景色を設定すると、オブジェクトが表示されなくなります。

Graphics g = jPanel1.getGraphics();  
g.setColor(Color.blue);
    g.drawLine( 0, 50,  20, 50);
    g.setColor(Color.white); 
    g.fillRect(40, 50,  20, 20); 
    g.setColor(Color.blue); 
    g.drawRect(40, 50,  20, 20); 
    g.drawOval(80, 50,  20, 20); 
    g.setColor(Color.green); 
    g.fillOval(80, 50,  18, 18);   

これはあなたの真の愛への信仰を回復します:-)ここでの困難は、どんな変更や再描画もあなたの努力を消すことです。このアプローチは、Javaファウンダーによって特に推奨されていません。ただし、現在のNetbeans Swingのレンディションでは、jPanelの拡張がコード変更のロックによって困難になるため、このアプローチが唯一の短期的な解決策になる可能性があります。 jPanelの単純な永続的なグラフィック拡張機能は、現在のNetbeans Swing環境であるグラフィックパネルに最も歓迎される追加です。これにより、グラフィックパネルをドラッグアンドドロップして、イベント駆動のそのパネルを使用できるようになります。他のIDEにはすでにこの機能があるようですが、Javaがこの機能の追加に時間がかかっているようです。

1
Edward Kimble