【java】实现JPanel鼠标拖拽

本文介绍如何在Java中实现JPanel的鼠标拖拽功能。代码结构清晰,但存在两个问题:未能调整JPanel透明度,以及在mouseDragged事件中Panel位置更新的不连续性,需要通过线程控制。作者指出这一功能仍有改进空间。
摘要由CSDN通过智能技术生成

话不多说,先上代码:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.event.MouseInputListener;

public class MainFrame extends JFrame {
	final JPanel panel1 = new JPanel();
	final JPanel panel2 = new JPanel();
	final JPanel maskJPanel = new JPanel();

	public MainFrame() {
		this.setSize(900, 600);
		this.setLayout(null);
		this.add(panel1);
		this.add(panel2);
		this.add(maskJPanel);
		panel1.setBounds(0, 0, 100, 100);
		panel2.setBounds(200, 0, 100, 100);
		panel1.setBackground(new Color(0));
		panel2.setBackground(new Color(1));
		ImageIcon bgiIcon = new ImageIcon("mask.png");
		JLabel bg = new JLabel(bgiIcon);
		maskJPanel.add(bg);
		bg.setBounds(0, 0, 100, 100);
		t
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现程序的代码: ``` import java.awt.*; import java.awt.event.*; import javax.swing.*; public class DrawPanel extends JPanel implements MouseListener, MouseMotionListener { private int startX, startY, endX, endY; private boolean isDrawingLine = false; private boolean isDrawingFree = false; private boolean isButtonSelected = false; private String selectedButton = ""; public DrawPanel() { addMouseListener(this); addMouseMotionListener(this); } public void paintComponent(Graphics g) { super.paintComponent(g); if (isDrawingLine) { g.drawLine(startX, startY, endX, endY); } } public void mousePressed(MouseEvent e) { startX = e.getX(); startY = e.getY(); isButtonSelected = true; } public void mouseDragged(MouseEvent e) { endX = e.getX(); endY = e.getY(); if (selectedButton.equals("line")) { isDrawingLine = true; } else if (selectedButton.equals("free")) { isDrawingFree = true; } repaint(); } public void mouseReleased(MouseEvent e) { endX = e.getX(); endY = e.getY(); if (selectedButton.equals("line")) { isDrawingLine = false; } else if (selectedButton.equals("free")) { isDrawingFree = false; } repaint(); } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void setSelectedButton(String button) { selectedButton = button; } public static void main(String[] args) { JFrame frame = new JFrame("Draw Panel"); DrawPanel panel = new DrawPanel(); JPanel buttonPanel = new JPanel(); JRadioButton lineButton = new JRadioButton("Line"); JRadioButton freeButton = new JRadioButton("Free"); ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(lineButton); buttonGroup.add(freeButton); buttonPanel.add(lineButton); buttonPanel.add(freeButton); lineButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { panel.setSelectedButton("line"); } }); freeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { panel.setSelectedButton("free"); } }); frame.add(panel, BorderLayout.CENTER); frame.add(buttonPanel, BorderLayout.SOUTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(500, 500); frame.setVisible(true); } } ``` 在程序中,我们创建了一个`DrawPanel`类,该类继承自`JPanel`,并实现了`MouseListener`和`MouseMotionListener`接口。在`DrawPanel`类中,我们定义了一些变量,如`startX`、`startY`、`endX`、`endY`等,用于存储鼠标的位置。我们还定义了三个布尔类型的变量,`isDrawingLine`、`isDrawingFree`和`isButtonSelected`,分别表示当前是否正在画直线、是否正在画任意曲线以及是否选择了按钮。我们还定义了一个字符串类型的变量`selectedButton`,用于存储当前选择的按钮。 在`DrawPanel`类中,我们重写了`paintComponent()`方法,用于绘制直线。在`mousePressed()`方法中,我们记录鼠标的起始位置,并将`isButtonSelected`设为`true`。在`mouseDragged()`方法中,我们记录鼠标的结束位置,并根据当前选择的按钮设置`isDrawingLine`和`isDrawingFree`的值。最后,在`mouseReleased()`方法中,我们更新`isDrawingLine`和`isDrawingFree`的值,并调用`repaint()`方法重新绘制面板。 在`main()`方法中,我们创建了一个`JFrame`窗口,并将`DrawPanel`面板添加到窗口中。我们还创建了一个`JPanel`面板,用于放置单选按钮,并将它添加到窗口的南边。我们使用`ButtonGroup`类来组合两个单选按钮,并为每个单选按钮添加了一个事件监听器,当单选按钮被选中时,我们将`selectedButton`变量的值设为相应的字符串。最后,我们设置了窗口的关闭方式、大小和可见性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值