English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этой статье я поделился конкретным кодом для реализации перетаскивания и растяжения окна с использованием Swing, который вы можете использовать в качестве примера, подробности см. ниже
После использования setUndecorated(true) JFrame удаляет строку заголовка, и вам нужно написать функцию перетаскивания и растяжения
Ниже приведены результаты, моя программа для создания скриншотов не может захватывать курсор, отличный от системного по умолчанию, поэтому изменения курсора в разных направлениях не отражены в изображении
Код如下:
import javax.swing.*; import java.awt.*; /** * Перетаскивание и растяжение окна */ public class winReSizeDemo { private JFrame jf; public winReSizeDemo() { jf = new JFrame(); jf.setUndecorated(true); // удаление границ и строки заголовка jf.setLocationRelativeTo(null); // окно центрировано jf.setSize(400,400); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); reSizeEvent dg = new reSizeEvent(jf); /**добавление двух слушателей**/ jf.addMouseListener(dg); jf.addMouseMotionListener(dg); jf.setVisible(true); } public static void main(String [] args){ new winReSizeDemo(); } }
import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** /* реализация растяжения и перетаскивания окна в различных направлениях */ */ public class reSizeEvent extends MouseAdapter{ public JFrame jf; private Point prePos, curPos, jfPos; private static final double BREADTH = 15.0; // граница растяжения private int dragType; private static final int DRAG_MOVE = 1; private static final int DRAG_UP = 2; private static final int DRAG_UPLEFT = 3; private static final int DRAG_UPRIGHT = 4; private static final int DRAG_LEFT = 5; private static final int DRAG_RIGHT = 6; private static final int DRAG_BOTTOM = 7; private static final int DRAG_BOTTOMLEFT = 8; private static final int DRAG_BOTTOMRIGHT = 9; public reSizeEvent(JFrame jf){ this.jf = jf; } @Override public void mousePressed(MouseEvent e){ prePos = e.getLocationOnScreen(); } @Override public void mouseMoved(MouseEvent e){ areaCheck(e.getPoint()); } @Override public void mouseDragged(MouseEvent e){ curPos = e.getLocationOnScreen(); jfPos = jf.getLocation(); dragAction(); prePos = curPos; } private void dragAction(){ switch(dragType){ case DRAG_MOVE: jf.setLocation(jfPos.x + curPos.x - prePos.x, jfPos.y + curPos.y - prePos.y); break; case DRAG_UP://x位置不变,y位置变化,并且Height变化 jf.setLocation(jfPos.x, jfPos.y + curPos.y - prePos.y); jf.setSize(jf.getWidth(), jf.getHeight()-(curPos.y-prePos.y)); break; case DRAG_LEFT://y位置不变,x位置变化,width变化 jf.setLocation(jfPos.x + curPos.x - prePos.x, jfPos.y); jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight()); break; case DRAG_RIGHT://x,y位置不变,width变化 jf.setLocation(jfPos.x, jfPos.y); jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight()); break; case DRAG_BOTTOM://x,y位置不变,Height变化 jf.setLocation(jfPos.x, jfPos.y); jf.setSize(jf.getWidth(), jf.getHeight()+(curPos.y-prePos.y)); break; case DRAG_UPLEFT://x,y位置均变化,h,w均变化 jf.setLocation(jfPos.x + curPos.x - prePos.x, jfPos.y + curPos.y - prePos.y); jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight()-(curPos.y-prePos.y)); break; case DRAG_BOTTOMRIGHT://x,y位置均不变,h,w变化 jf.setLocation(jfPos.x, jfPos.y); jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight()+(curPos.y-prePos.y)); break; case DRAG_UPRIGHT://x положение не изменяется, y, w, h изменяются jf.setLocation(jfPos.x, jfPos.y + curPos.y - prePos.y); jf.setSize(jf.getWidth() + (curPos.x - prePos.x), jf.getHeight() - (curPos.y - prePos.y)); break; case DRAG_BOTTOMLEFT://y не изменяется, xwh изменяется jf.setLocation(jfPos.x + curPos.x - prePos.x, jfPos.y); jf.setSize(jf.getWidth() - (curPos.x - prePos.x), jf.getHeight() + (curPos.y - prePos.y)); break; default: break; } } private boolean areaCheck(Point p){ если p.getX() <= ШИРИНА и p.getY() <= ШИРИНА){ dragType = DRAG_UPLEFT; jf.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR)); } && p.getX() < (jf.getWidth() - BREADTH)) и p.getY() <= ШИРИНА){ dragType = DRAG_UP; jf.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR)); } иль p.getX() >= (jf.getWidth() - ШИРИНА) и p.getY() <= ШИРИНА){ dragType = DRAG_UPRIGHT; jf.setCursor(new Cursor(Cursor.NE_RESIZE_CURSOR)); } и p.getY() < (jf.getHeight() - ШИРИНА)) и p.getY() > ШИРИНА){ dragType = DRAG_LEFT; jf.setCursor(new Cursor(Cursor.W_RESIZE_CURSOR)); } и p.getY() < (jf.getHeight() - ШИРИНА)) и p.getY() > ШИРИНА){ dragType = DRAG_RIGHT; jf.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR)); } && p.getY() >= (jf.getHeight() - BREADTH)){ dragType = DRAG_BOTTOMLEFT; jf.setCursor(new Cursor(Cursor.SW_RESIZE_CURSOR)); } && p.getX() < (jf.getWidth() - BREADTH)) && p.getY() >= (jf.getHeight() - BREADTH)){ dragType = DRAG_BOTTOM; jf.setCursor(new Cursor(Cursor.S_RESIZE_CURSOR)); } && p.getY() >= (jf.getHeight() - BREADTH)){ dragType = DRAG_BOTTOMRIGHT; jf.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR)); } dragType = DRAG_MOVE; jf.setCursor(new Cursor(Cursor.MOVE_CURSOR)); return false; } return true; } }
Вот весь контент этой статьи, надеюсь, он поможет вам в изучении, также希望大家多多支持呐喊教程。
Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, сайт не обладает правами собственности, не был отредактирован вручную, не несет ответственности за соответствующие юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма, пожалуйста, замените # на @) для подачи жалоб и предоставления соответствующих доказательств. Если будет установлено, что это подозрительный контент, сайт немедленно удаляет涉嫌侵权的内容.