2016-02-08 2 views
0

У меня есть три JPanel s. Левая и правая панели скрыты. По умолчанию отображается только центральная панель.Как расширить jframe в левой части?

Когда я нажимаю одну кнопку, ширина рамки будет увеличена на ширину правой панели, и правая панель станет видимой.

Моя проблема с левой панелью, потому что рамка не может быть увеличена в левом направлении.

Мое решение:

public void mousePressed(MouseEvent e) { 
    int frameWidth = frame.getBounds().width; 
    int frameHeight = frame.getBounds().height; 
    int panelWidth = leftPanel.getPreferredSize().width; 
    Point currCoords = frame.getLocationOnScreen(); 

    if(!_leftPanelOpened) { 
     frame.setSize(new Dimension(frameWidth + panelWidth, frameHeight)); 
     leftPanel.setVisible(true); 
     frame.setLocation(currCoords.x - panelWidth, currCoords.y); 
     _leftPanelOpened = true; 
    } 
    else { 
     leftPanel.setVisible(false); 
     frame.setSize(new Dimension(frameWidth - panelWidth, frameHeight)); 
     frame.setLocation(currCoords.x + panelWidth, currCoords.y); 
     _leftPanelOpened = false; 
    } 
} 

Он работает, но рама вскоре начинает мигать. Могу ли я избежать этого короткого мигания?

Edit:

public class Main { 

    private static JPanel leftoption = new JPanel(); 
    private static JPanel rightoption = new JPanel(); 
    private static JFrame frame = new JFrame(); 
    private static JPanel leftPanel = new JPanel(); 
    private static JPanel rightPanel = new JPanel(); 
    private static JPanel _centerPanel = new JPanel(); 
    private static boolean _leftPanelOpened = false; 
    private static boolean _rightPanelOpened = false; 

    public static void main(String[] args) { 
     leftoption.setPreferredSize(new Dimension(50, 40)); 
     leftoption.setBackground(Color.CYAN); 
     leftoption.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       int frameWidth = frame.getBounds().width; 
       int frameHeight = frame.getBounds().height; 
       int panelWidth = leftPanel.getPreferredSize().width; 
       Point currCoords = frame.getLocationOnScreen(); 

       if(!_leftPanelOpened) { 
        frame.setBounds(currCoords.x - panelWidth, currCoords.y, frameWidth + panelWidth, frameHeight); 
        leftPanel.setVisible(true); 
        _leftPanelOpened = true; 
       } 
       else { 
        leftPanel.setVisible(false); 
        frame.setBounds(currCoords.x + panelWidth, currCoords.y, frameWidth - panelWidth, frameHeight); 
        _leftPanelOpened = false; 
       } 
      } 
      @Override 
      public void mouseReleased(MouseEvent e) { 

      } 
     }); 

     rightoption.setPreferredSize(new Dimension(50, 40)); 
     rightoption.setBackground(Color.ORANGE); 
     rightoption.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       int frameWidth = frame.getBounds().width; 
       int frameHeight = frame.getBounds().height; 
       int panelWidth = rightPanel.getPreferredSize().width; 
       if(!_rightPanelOpened) { 
        frame.setSize(new Dimension(frameWidth+panelWidth, frameHeight)); 
        rightPanel.setVisible(true); 
        _rightPanelOpened = true; 
       } 
       else { 
        rightPanel.setVisible(false); 
        frame.setSize(new Dimension(frameWidth-panelWidth, frameHeight)); 
        _rightPanelOpened = false; 
       } 
      } 
      @Override 
      public void mouseReleased(MouseEvent e) { 

      } 
     }); 


     _centerPanel.setPreferredSize(new Dimension(300, 600)); 
     _centerPanel.setBackground(Color.WHITE); 
     _centerPanel.add(leftoption); 
     _centerPanel.add(rightoption); 

     leftPanel.setPreferredSize(new Dimension(300, 600)); 
     leftPanel.setBackground(Color.BLUE); 
     leftPanel.setVisible(false); 

     rightPanel.setPreferredSize(new Dimension(300, 600)); 
     rightPanel.setBackground(Color.RED); 
     rightPanel.setVisible(false); 

     frame.add(leftPanel, BorderLayout.LINE_START); 
     frame.add(_centerPanel, BorderLayout.CENTER); 
     frame.add(rightPanel, BorderLayout.LINE_END); 

     frame.setSize(new Dimension(300, 600)); 
     frame.getContentPane().setBackground(Color.WHITE); 

     frame.setVisible(true); 
    } 

} 
+0

Вам нужно рассчитать новое й положение кадра. Так как кадр становится более широким, вам нужно изменить положение x так, чтобы оно выглядело так, как будто оно расширяется влево – MadProgrammer

+0

. Но у меня была эта проблема с миганием. –

+0

Рамка не будет изменяться без изменений, попробуйте вручную изменить размер окна – MadProgrammer

ответ

0

Вы можете позвонить setBounds(), который позволяет установить положение и размер в то же время. На самом деле, под капотом, оба setSize() и setLocation() звоните setBounds() в конце.

Кроме того, вы можете избежать вызова setVisible(true) перед тем, как панель будет на месте.

Поэтому, как о смене метод:

if(!_leftPanelOpened) { 
    frame.setBounds(currCoords.x - panelWidth, currCoords.yframeWidth + panelWidth, frameHeight); 
    leftPanel.setVisible(true); 
    _leftPanelOpened = true; 
} 
+0

К сожалению, все еще делает эту вспышку. Возможно, возникнет другая проблема? Я обыскал сеть, и кажется, что у этой проблемы нет. –

Смежные вопросы