2011-08-14 14 views
5

मैं निम्नलिखित कोड है:बटन पर पैनल आकार बदलें क्लिक

package in.res.num.tapb.ui; 

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

class MainClass extends JPanel { 
    public MainClass() { 
     Registration registration = new Registration(); 
     ButtonPanel buttonPanel = new ButtonPanel(); 
     buttonPanel.setRegistration(registration); 

     buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel")); 
     registration.setBorder(BorderFactory.createTitledBorder("Registration Panel")); 

     setLayout(new BorderLayout()); 
     add(registration, BorderLayout.CENTER); 
     add(buttonPanel, BorderLayout.SOUTH); 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Registration"); 
     frame.getContentPane().add(new MainClass()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 

    @SuppressWarnings("serial") 
    private class ButtonPanel extends JPanel { 
     private Registration registration; 

     public ButtonPanel() { 
      setLayout(new GridLayout(1, 0, 10, 0));  
      for (final String keyText : Registration.KEY_TEXTS) { 
       JButton btn = new JButton(keyText); 
       btn.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         if (registration != null) { 
          registration.swapView(keyText); 
         } 
        } 
       }); 
       add(btn); 
      } 
     } 

     public void setRegistration(Registration registration) { 
      this.registration = registration; 
     } 
    } 

    private static class Registration extends JPanel { 
     private static final Dimension PREF_SIZE = new Dimension(450, 300); 
     public static final String USER_AGREEMENT = "User Agreement"; 
     public static final String USER_INFO = "User Information"; 
     public static final String ENROLLMENT = "Enrollment"; 
     public static final String[] KEY_TEXTS = { USER_AGREEMENT, USER_INFO, ENROLLMENT }; 
     private CardLayout cardlayout = new CardLayout(); 
     private JPanel cards = new JPanel(cardlayout); 

     public Registration() { 
      cards.add(createUserAgreePanel(), USER_AGREEMENT); 
      cards.add(createUserInfoPanel(), USER_INFO); 
      cards.add(createEnrollmentPanel(), ENROLLMENT); 
      setLayout(new BorderLayout()); 
      add(cards, BorderLayout.CENTER); 
     } 



     private JPanel createEnrollmentPanel() { 
      JPanel enrol = new JPanel(); 
      enrol.setSize(new Dimension(400, 200)); 
      enrol.add(new JLabel("Enrollment")); 
      return enrol; 
     } 

     private JPanel createUserAgreePanel() { 
      JPanel userAgree = new JPanel(); 
      userAgree.setSize(new Dimension(200, 300)); 
      userAgree.add(new JLabel("User Agreement")); 
      return userAgree; 
     } 

     private JPanel createUserInfoPanel() { 
      JPanel userInfo = new JPanel(); 
      userInfo.setSize(new Dimension(300, 400)); 
      userInfo.add(new JLabel("User Information")); 
      return userInfo; 
     } 

     public void swapView(String key) { 
      cardlayout.show(cards, key); 
     } 

    } 

} 

आप देख सकते हैं मैं बटन पर क्लिक आकार बदलना चाहते हैं। क्या यह संभव है? उपर्युक्त कोड काम नहीं कर रहा है, मेरा मतलब है कि आकार बदल नहीं रहा है। मैं फ्लाई पर आकार कैसे बदल सकता हूं?

धन्यवाद और सम्मान करता है। संपादित करें:

जेएलिस्ट की एक पंक्ति का चयन करने के लिए पैनल को स्वैप करें।

getChoicesList().addListSelectionListener(new ListSelectionListener() { 

     @Override 
     public void valueChanged(ListSelectionEvent listSelectionEvent) { 
      getViewPanel().changeView(getChoicesList().getSelectedIndex()); 
      getChoicePanel().changeView(Constants.PanelInfo.valueOf(getEngine().getChoiceList().get(getChoicesList().getSelectedIndex()).getEnumName()).getDimensionForScrollPaneOfChoicePanel()); 
      ((MainFrame) getTopLevelAncestor()).pack(); 
     } 
    }); 

ViewPanel # changeView(), इस पैनल स्वैप:

public void changeView(int index) { 
    removeAll(); 
    getPanels().get(index).setPreferredSize(Constants.PanelInfo.valueOf(getEngine().getChoiceList().get(index).getEnumName()).getDimensionForViewPanel()); 
    add(getPanels().get(index)); 
} 
+2

इस मदद कर सकते हैं हो सकता है http://stackoverflow.com/questions/3889498/how-can-i-increase-decrease-size-of-window-on-click-event – Shadow

+0

+1 धन्यवाद ... –

+0

+1 [एसएससीईएस] के लिए +1 (http://sscce.org/)। – trashgod

उत्तर

3

लेआउट मैनेजर का उपयोग करते समय आपको कभी भी setSize() का उपयोग नहीं करना चाहिए। यह आकार निर्धारित करने के लिए लेआउट प्रबंधक का काम है। आप चरम या न्यूनतम या अधिकतम आकार निर्धारित करके लेआउट प्रबंधक को संकेत प्रदान कर सकते हैं। हालांकि यह अनुशंसा नहीं की जाती है कि आप ऐसा करते हैं क्योंकि घटकों और पैनलों को उनके पसंदीदा आकार में प्रदर्शित किया जाना चाहिए जो आपके द्वारा उपयोग किए जा रहे लेआउट प्रबंधक द्वारा निर्धारित किया जाएगा। आप आकार को ओवरराइड किया तो कोड होना चाहिए:

// enrol.setSize(new Dimension(400, 200)); 
enrol.setPreferredSize(new Dimension(400, 200)); 

बहरहाल, यह अभी जिस तरह से आप चाहते हैं काम नहीं करेगा क्योंकि CardLayout का काम सभी पैनलों पैनल में जोड़ा के सबसे बड़े आकार निर्धारित करने के लिए है कार्डलाउट का उपयोग करना तो जब आप पैनल से पैनल में स्वैप करते हैं तो आपको प्रत्येक व्यक्तिगत पैनल का आकार नहीं मिलता है। यह उपयोगकर्ता के लिए बेहतर अनुभव है क्योंकि उपयोगकर्ता फ्रेम बटन को हर बार बटन दबाते समय बदलना नहीं चाहता है।

आप फ्रेम परिवर्तन आकार हर बार जब आप एक बटन पर क्लिक करें के लिए करना चाहता था तो बुनियादी कोड होगा:

mainPanel.remove(oldPanel); 
mainPanel.add(newPanel); 
frame.pack(); 

तब मुख्य पैनल के लेआउट प्रबंधक के पसंदीदा आकार का पालन करेंगे न्यूले जोड़ा पैनल।

4

JFrame, उपयोग का आकार बदलने के बाद: yourframe.validate();

+1

फ्रेम का आकार बदलने से फ्रेम को सत्यापित किया जाएगा। – camickr

3

कैमिकर के answer के ठोस उदाहरण के रूप में, नीचे दिया गया प्रोग्राम दिखाता है कि फ्रेम के आकार को pack() के माध्यम से आकार बदलने के तरीके के रूप में कैसे दिखाया जाता है। अशुद्ध सामग्री लेबल की एक श्रृंखला है, लेकिन कोई भी JComponent करेगा। चूंकि सामग्री को गतिशील रूप से पुनर्निर्मित किया जाता है, यह प्रोग्राम में अन्य स्थितियों के अनुसार बदल सकता है।

enter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

/** @see https://stackoverflow.com/questions/7059278 */ 
class MainPanel extends JPanel { 

    private static final String title = "Registration Panel"; 
    private JFrame frame = new JFrame(title); 
    private JPanel registration = new JPanel(); 

    public MainPanel() { 
     this.setLayout(new BorderLayout()); 
     registration.setBorder(BorderFactory.createTitledBorder(title)); 
     registration.add(PanelType.USER_AGREEMENT.panel); 
     ButtonPanel buttonPanel = new ButtonPanel(); 
     buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel")); 
     add(registration, BorderLayout.CENTER); 
     add(buttonPanel, BorderLayout.SOUTH); 
    } 

    private void display() { 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new MainPanel()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new MainPanel().display(); 
      } 
     }); 
    } 

    private class ButtonPanel extends JPanel { 

     public ButtonPanel() { 
      for (final PanelType panel : PanelType.values()) { 
       final JButton button = panel.button; 
       this.add(button); 
       button.addActionListener(new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         registration.removeAll(); 
         registration.add(panel.create()); 
         frame.pack(); 
         frame.setLocationRelativeTo(null); 
        } 
       }); 
      } 
     } 
    } 

    private enum PanelType { 

     USER_AGREEMENT("User Agreement", 2), 
     USER_INFO("User Information", 4), 
     ENROLLMENT("Enrollment Form", 6); 
     private String name; 
     private int count; 
     private JButton button; 
     private JPanel panel; 

     private PanelType(String name, int count) { 
      this.name = name; 
      this.count= count; 
      this.button = new JButton(name); 
      this.panel = create(); 
     } 

     private JPanel create() { 
      this.panel = new JPanel(new GridLayout(0, 1)); 
      this.panel.add(new JLabel(name)); 
      this.panel.add(new JLabel(" ")); 
      for (int i = 0; i < count; i++) { 
       this.panel.add(new JLabel("Label " + String.valueOf(i + 1))); 
          } 
      return panel; 
     } 
    } 
}