버튼 클릭으로 JPanel에서 선 그리기
문제:
그림을 그리고 싶은 사람이 있습니다. 버튼을 클릭했지만 도면에 대한 오해로 인해 어려움을 겪을 때 JPanel의 선 process.
해결책:
JPanel에서 선을 그리려면 다른 접근 방식이 제안됩니다.
구현:
다음 코드는 구현을 보여줍니다.
<사전>
가져오기 java.awt.BasicStroke;
가져오기 java.awt.Color;
가져오기 java.awt.Dimension;
가져오기 java.awt.Graphics;
가져오기 java.awt.Graphics2D;
가져오기 java.awt.Point;
가져오기 java.awt.RenderingHints;
java.awt.event.ActionEvent 가져오기;
java.awt.event.KeyEvent 가져오기;
java.awt.event.MouseAdapter 가져오기;
java.awt 가져오기. event.MouseEvent;
가져오기 javax.swing.AbstractAction;
import javax.swing.JButton;
javax.swing.JFrame 가져오기;
javax.swing.JPanel 가져오기;
javax.swing.KeyStroke 가져오기;
공개 클래스 LinePanel은 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(); } }); }
}
이 코드는 마우스 클릭, 끌기, 놓기를 사용하여 선을 그리는 기능과 버튼 패널을 제공합니다. 라인의 움직임을 제어합니다.
위 내용은 마우스 클릭과 드래그를 사용하여 JPanel에서 선을 그리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!