Search code examples
javaswingjwindow

Window of JWindow doesn't move


I have a frame extends from JWindow (because I want to handle my X and - buttons) so I don't want it decorated. My problem is when I run the application I can't drag my window - it's fixed in a certain location. My code is as follows (the class i big so i picked the related section):

public class StatisticsMainFrame extends JWindow{

public StatisticsMainFrame()
{
     bodyPane = new JPanel();
    bodyPane.setLayout(new BoxLayout(bodyPane, BoxLayout.X_AXIS));
    sideBannerPane = new JPanel(); // program banner
    buttonsPane = new JPanel(); // contains buttons
    contentPane = new JPanel();
    contentPane.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
    contentPane.setPreferredSize(new Dimension(500,500)); 
    // contentPane contains some panel for display data


    Container container = new Container();
    container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
    container.add(Box.createVerticalGlue());
    container.add(sideBannerPane);
    container.add(buttonsPane);
    container.add(contentPane);

    Container cont = new Container();
    cont.setLayout(new BoxLayout(cont, BoxLayout.Y_AXIS));
    //cont.add(Box.createHorizontalGlue());
    //cont.add(custDecorationPane);
    cont.add(container);
    add(cont);
    // Adding Panes

    setAlwaysOnTop(true);
    //setUndecorated(true);
    pack();

}

public static void main(String[] arg)
{
    new StatisticsMainFrame().setVisible(true);
}


private CustomFrameDecorationButtons custDecorationPane;
private JPanel bodyPane;
private JPanel contentPane;
private JPanel sideBannerPane;
private JPanel buttonsPane;

// buttonsPane components
private JLabel general_lbl;
private JLabel Diagnosis_lbl;
private JLabel chemotherapy_lbl;
private JLabel radiotherapy_lbl;
private JLabel surgery_lbl;
private JLabel hermonalTherapy_lbl;

private RootButton generalStatistics_btn;
private RootButton statOfAffectedSys_btn;
private RootButton statOfGrade_btn;
private RootButton statOfCombinations_btn;
private RootButton statOfResponses_btn;
private RootButton statOfRadiotherapy_btn;
private RootButton statOfSurgery_btn;
private RootButton statOfHermonaltherapy_btn;

private GeneralStatisticsContentPanel generalStatPane;
private StatisticsOfAffectedSystemPanel2 statOfAffectedSysPanel2;
private StatisticsOfGradePanel statOFGradingPanel;
private ChemotherapyCombinationStatisticsPanel statChemotherapyCombinationPanel;
private ChemotherapyResponseStatisticsPanel statChemotherapyResponsePanel;
private RadiotherapyStatisticsPanel radiotherapyPanel;
private SurgeryStatisticsPanel surgeryStatPanel;
private HermonaltherapyStatisticsPanel hermonaltherapy;

}


Solution

  • You can add a custom drag using for example the following code:

    addMouseMotionListener(new MouseMotionListener() {
        private int mx, my;
    
        @Override
        public void mouseMoved(MouseEvent e) {
            mx = e.getXOnScreen();
            my = e.getYOnScreen();
        }
    
        @Override
        public void mouseDragged(MouseEvent e) {
            Point p = StatisticsMainFrame.this.getLocation();
            p.x += e.getXOnScreen() - mx;
            p.y += e.getYOnScreen() - my;
            mx = e.getXOnScreen();
            my = e.getYOnScreen();
            StatisticsMainFrame.this.setLocation(p);
        }
    });
    

    If you place this snippet directly in the constructor of StatisticsMainFrame you can use the mouse to drag the window by clicking anywhere inside the window. (You can also add the listener to any other component.)