JPanelで線を引きたい。これは私のGUIで、JPanelに白の線が必要です。
多くの例を見つけましたが、問題はそれの使い方です。
多くの例では、常に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
次の方法を使用すると、線を描くほうが簡単な場合があります。
この関連 例 は、追加のガイダンスを提供する場合があります。
Action
インターフェイスを使用するこの関連 example も参照してください。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();
}
});
}
}
これはスケッチのように機能しますか?次に、ポイントの現在の位置を追跡する必要があります。
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.
}
グラフィックスをトリガーするための簡単な答えがあります。次のコードは、クリックイベント内に配置して、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がこの機能の追加に時間がかかっているようです。