2012-07-20 158 views
1

我在單擊按鈕上將面板添加到已顯示的JFrame中。現在,當用戶調整框架大小時,面板保持不變。我想要的是面板位置也應該隨着框架大小調整。任何方式來做到這一點?調整jpanel在jframe上的位置調整大小

代碼再生我的問題:

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

import javax.swing.BorderFactory; 
import javax.swing.GroupLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class ProblemPanelLocation { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       final JFrame frame = new JFrame("ProblemPanelLocation"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setSize(250, 250); 
       final JPanel panel = new JPanel(); 
       panel.setSize(100, 100); 
       panel.setBorder(BorderFactory.createBevelBorder(1)); 
       final JButton button = new JButton("Add panel"); 
       button.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         panel.setLocation(button.getX() - button.getWidth() - 10, button.getY()); 
         frame.getLayeredPane().add(panel, JLayeredPane.MODAL_LAYER); 
        } 
       }); 
       GroupLayout layout = new GroupLayout(frame.getContentPane()); 
       frame.getContentPane().setLayout(layout); 
       layout.setHorizontalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
        .addGroup(GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
         .addContainerGap(317, Short.MAX_VALUE) 
         .addComponent(button) 
         .addContainerGap()) 
       ); 
       layout.setVerticalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
         .addContainerGap() 
         .addComponent(button) 
         .addContainerGap(266, Short.MAX_VALUE)) 
       ); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

場景:

  1. 起初,你看到它的按鈕的框架。
  2. 當你點擊它時,一個面板被添加到幀中,在幀的分層窗格中。
  3. 面板的位置根據按鈕位置計算。
  4. 現在,當您調整框架大小時,按鈕也會移動到框架的右側,但面板不會。

我想添加面板的方式,它的行爲就像按鈕的位置。可能嗎?如果是的話,我該怎麼辦?

+0

你是用這個來顯示類似通知的東西嗎?因爲在這種情況下,你可以將一個彈出框關聯到按鈕 – 2012-07-20 11:47:52

+0

@NitinChhajer。此面板還包含按鈕,onclick我必須在框架中執行一些操作。 – 2012-07-20 11:50:50

+1

@mark:你使用'JLayeredPane'的具體原因是什麼?如果你的'JButton'在開始時出現在'JFrame'的'CENTER'處,並且當你按下它''JPanel'出現它是'LEFT'並且當你調整'JFrame'時它們都保留在' 'JFrame'的CENTER',這種行爲是否可以接受? – 2012-07-20 16:47:14

回答

1
  1. 使用的ComponentListener:

    frame.addComponentListener(new ComponentAdapter() { 
        @Override 
        public void componentResized(ComponentEvent e) { 
         panel.setLocation(button.getX() - button.getWidth() - 10, button.getY()); 
        } 
    }); 
    
  2. 覆蓋所述框架的所述的setBounds()方法和更新位置在那裏。這是不推薦的,因爲此代碼將在與實際調整大小相同的EventDispatcher事件中執行,但它可能有助於避免在使用組件偵聽器時出現緩慢的重繪。

+0

我選擇第一個選項,謝謝你的幫助。 – 2012-07-24 13:46:55