在Java中用button单击在JPanel中画一条线

我想在JPanel中画一条线。 这是我的GUI,我想在白色的JPanel行。

在这里输入图像描述

我发现很多例子,但问题是如何使用它。

在许多示例中,他们总是从Jpanel中抽取一个JFrame。

我想将面板添加到框架中,并添加一些button来在多个方向上绘制线条,并使用中心的Xbutton来清理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); } 

那么如何使用这个线….

提前致谢。

最好的祝福,

阿里

使用以下方法绘制线条可能会更容易:

  1. 点击标记第一个端点
  2. 拖动以显示正在进行的线
  3. 释放以标记第二个端点

这个相关的例子可以提供一些额外的指导

附录

  1. 下面的例子实现了上面的概述。
  2. 我已经更新了示例以显示如何使用一组button来影响绘图。
  3. 另请参阅与键绑定一起使用Action接口的相关示例 。
  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(); } }); } } 

这是否像一个蚀刻素描? 那么你需要跟踪点的当前位置。

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

然后,当用户点击button,你可以简单地增加或减lessx和y。

在左边的箭头上:

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

INC可能是一个variables,它指定画线的距离的长度。 也许5? 尽pipe如此,总是将第二个点p1设置为之前的位置。

创build一个扩展Canvas或JPanel来绘制而不是直接在JFrame上绘制的类会更容易。

例如

 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. } 

触发graphics有一个简单的答案:例如下面的代码可以放在一个点击事件中,用于在jPanel上绘制一些简单的对象。 在这种情况下,jPanel1位于标签jPanel7的一侧,并在触发button旁边。 要在NetBeans GUI中这样做,代码被放置在button操作事件中。 一旦通常的错误出现没有适当的import,右键单击代码,然后单击“修复import”。 宾果,一切都很好:-)警告:面板的setBackground命令将覆盖graphics对象。 如果您不使用graphics对象设置背景颜色,则不会看到您的对象!

 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的当前版本中,通过locking代码更改使扩展jPanel变得困难,这种方法可能是您唯一的短期解决scheme。 对于jPanel来说,一个简单的持久graphics扩展将成为当前NetBeans Swing环境(一个graphics面板)的最受欢迎的补充。 这将允许您拖放graphics面板,然后继续使用该面板的事件驱动。 另外40个IDE已经有了这个,看来Java已经慢慢的添加这个function了。