هل يمكننا عمل موضوع التحريك بدون الحاجة إلى top bar
بالطبع يمكننا تحتاج إلى mouseEvents
هكذا يوجد مفر لكنه مفر صعب بعض الشيء :)
تحياتي
هل يمكننا عمل موضوع التحريك بدون الحاجة إلى top bar
بالطبع يمكننا تحتاج إلى mouseEvents
هكذا يوجد مفر لكنه مفر صعب بعض الشيء :)
تحياتي
هههههههههههه
فعلا كنت أفكر بذلك ،، لأني تعالت مع برامج بالشكل دا
منها الـ 4Shared Desktop
اعتقد ليست بتلك الصعوبه ،، باستخدام الـ mouse dragged , mouse dropped
وبعد ذلك أقوم بحساب الاحداثيات الجديده للماوس واقوم برسم الفريم مرة اخري في الاحداثيات الجديده
ربما اثناء التجربه يتضح الأمر ان كان صعب أم لا :D
شكراً لك أستاذ علاء :)
صــفــر
اعملتها و زبطت :)
package javaapplication3;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
/**
*
* @author mersan
*/
public class MainFrame extends JFrame implements MouseListener, MouseMotionListener {
static MainFrame mainFrame;
static boolean isLMBDown;
int xDiff = 0, yDiff = 0;
public static void main(String[] args) {
// TODO code application logic here
mainFrame = new MainFrame();
mainFrame.initFrame();
}
private void initFrame() {
mainFrame.setUndecorated(true);
mainFrame.setSize(500, 500);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
mainFrame.addMouseListener(this);
mainFrame.addMouseMotionListener(this);
System.out.println(mainFrame.getLocationOnScreen());
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
xDiff = (int) (e.getXOnScreen() - (mainFrame.getLocationOnScreen().getX()));
yDiff = (int) (e.getYOnScreen() - (mainFrame.getLocationOnScreen().getY()));
isLMBDown = true;
}
public void mouseReleased(MouseEvent e) {
isLMBDown = false;
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if (isLMBDown) {
mainFrame.setLocation(e.getXOnScreen() - xDiff, e.getYOnScreen() - yDiff);
}
}
public void mouseMoved(MouseEvent e) {
}
}جميل جداً جداً
وكمان رافعها على youtube :)
يعطيك العافية
أظنني أفضلها حتى على النوافذ العادية
لكن هل تؤثر هكذا على الحدث mouse event داخل النافذة؟
أم أن الأحداث داخل المكونات تلغي بعضها البعض بالأولوية
تحياتي
يمكن اضافة هذا الحدث لاي كائن مثلا استبدل initFrame Method بالتالي :
private void initFrame() {
JLabel label = new JLabel("Drag Me");
label.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2));
label.addMouseListener(this);
label.addMouseMotionListener(this);
mainFrame.setLayout(new BorderLayout());
mainFrame.add(label, BorderLayout.NORTH);
mainFrame.setUndecorated(true);
mainFrame.setSize(500, 500);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
System.out.println(mainFrame.getLocationOnScreen());
}والان اضغط على ال Label (Drag Me) و حرك الفريم من خلالها :)
تم تعديل هذه المشاركة بواسطة Mohammed Mshari Ersan في 30 ديسمبر 2009 في 18:52
علاء الصالحي كتب:لا لا يا محمد قصدت هل لو كان كان كل الframe عبارة عن panel
هل تستطيع القيام بالتحريك أيضاً
تحياتي
ارجو ان اكون فهمت سؤالك حبيبي و عزيزي علاء
و تبين هذا الحل
لكنها ضعيفة ![]()
جربها عندك
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @author mersan
*/
public class MainFrame extends JFrame implements MouseListener, MouseMotionListener {
static MainFrame mainFrame;
static boolean isLMBDown;
int xDiff = 0, yDiff = 0;
private JPanel panel;
public static void main(String[] args) {
mainFrame = new MainFrame();
mainFrame.initFrame();
}
private void initFrame() {
mainFrame.setUndecorated(true);
mainFrame.setSize(500, 500);
mainFrame.setLocationRelativeTo(null);
mainFrame.setVisible(true);
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setSize(100, 200);
panel.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
panel.addMouseListener(this);
panel.addMouseMotionListener(this);
mainFrame.add(panel);
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
xDiff = (int) (e.getX() - (panel.getLocation().getX()));
yDiff = (int) (e.getY() - (panel.getLocation().getY()));
isLMBDown = true;
}
public void mouseReleased(MouseEvent e) {
isLMBDown = false;
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if (isLMBDown) {
panel.setLocation(e.getX() - xDiff, e.getY() - yDiff);
}
}
public void mouseMoved(MouseEvent e) {
}
}هذا ما قصدت يا محمد
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @author mersan
*/
public class TestJFrame extends JFrame implements MouseListener, MouseMotionListener {
static boolean isLMBDown;
int xDiff = 0, yDiff = 0;
private JPanel panel;
public TestJFrame() {
initFrame();
}
public static void main(String[] args) {
new TestJFrame();
}
private void initFrame() {
setUndecorated(true);
setSize(500, 500);
setLocationRelativeTo(null);
setVisible(true);
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setSize(500, 20);
panel.setBackground(Color.BLACK);
panel.setOpaque(true);
panel.addMouseListener(this);
panel.addMouseMotionListener(this);
getContentPane().add(panel);
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
xDiff = (int) (e.getXOnScreen() - (getLocationOnScreen().getX()));
yDiff = (int) (e.getYOnScreen() - (getLocationOnScreen().getY()));
isLMBDown = true;
}
public void mouseReleased(MouseEvent e) {
isLMBDown = false;
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if (isLMBDown) {
setLocation(e.getXOnScreen() - xDiff, e.getYOnScreen() - yDiff);
}
}
public void mouseMoved(MouseEvent e) {
}
}بدلاً من التحريك في أي مكان في Frame يمكنك تخصيص منطقة معينة للتحريك فقط
فعلياً قمت بعمل شيء شبه Jframe العادي
لكن هذا يمكنك من بناء وجهات عربية مثلاً
كما يمكنك من تعديل الإطار على النحو الذي تريد
من الآخر يمكنك من بناء واجهات متميزة
تحياتي
اخي علاء
هل جربت الذي كتبته من قبل
اقتباسيمكن اضافة هذا الحدث لاي كائن مثلا استبدل initFrame Method بالتالي :
private void initFrame() {
JLabel label = new JLabel("Drag Me");
label.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 2));
label.addMouseListener(this);
label.addMouseMotionListener(this);
mainFrame.setLayout(new BorderLayout());
mainFrame.add(label, BorderLayout.NORTH);
mainFrame.setUndecorated(true);
mainFrame.setSize(500, 500);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setVisible(true);
System.out.println(mainFrame.getLocationOnScreen());
}
والان اضغط على ال Label (Drag Me) و حرك الفريم من خلالها
اعذرني يا محمد
لم أنتبه إلى هذه النقطة
بالمناسبة أفكر في فتح موضوع جديد فيه المحتوى الذي كتبناه أنا وأنت
(الذي كتبته أنت لأجل الدقة وساعدت أنا في تخريبه :lol: )
ما رأيك في عنوان مثل نافذة بشريط عنوان مختلف؟
تحياتي
افعل ما يحلو لك
انت مشرفي
:) :) :wub: