2011-08-14 33 views
5

Tôi có đoạn mã sau:Thay đổi kích thước Panel trên nút bấm

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); 
     } 

    } 

} 

Như bạn có thể thấy tôi muốn thay đổi kích thước trên nút bấm. Có thể không? Đoạn mã trên không hoạt động, ý tôi là kích thước không thay đổi. Làm thế nào tôi có thể thay đổi kích thước trên bay?

Cảm ơn và kính trọng. Chỉnh sửa:

trao đổi bảng điều khiển khi chọn một hàng JList.

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(), đây giao dịch hoán đổi các bảng điều khiển:

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

có thể này có thể giúp http://stackoverflow.com/questions/3889498/how-can-i-increase-decrease-size-of-window-on-click-event – Shadow

+0

+1 Cảm ơn bạn ... –

+0

+1 cho [sscce] (http://sscce.org/). – trashgod

Trả lời

3

Bạn không bao giờ nên sử dụng setSize() khi sử dụng trình quản lý bố cục. Đó là công việc của người quản lý bố cục để xác định kích thước. Bạn có thể cung cấp gợi ý cho trình quản lý bố cục bằng cách đặt kích thước tối thiểu hoặc nhỏ nhất hoặc tối đa. Tuy nhiên, bạn không nên làm điều này vì các thành phần và bảng điều khiển sẽ được hiển thị ở kích thước ưa thích của chúng và sẽ được xác định bởi trình quản lý bố cục bạn đang sử dụng. Nếu bạn đã ghi đè lên các kích thước sau đó mã nên được:

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

Tuy nhiên, đây vẫn sẽ không làm việc theo cách bạn muốn, vì công việc của CardLayout là để xác định kích thước lớn nhất của tất cả các bảng bổ sung vào bảng điều khiển sử dụng một CardLayout. Vì vậy, khi bạn trao đổi từ bảng điều khiển để bảng điều khiển bạn không nhận được kích thước của từng bảng điều khiển riêng lẻ. Đây là trải nghiệm tốt hơn cho người dùng vì người dùng không muốn thấy kích thước khung tiếp tục thay đổi mỗi khi họ nhấn nút.

Nếu bạn muốn có kích thước thay đổi khung mỗi khi bạn nhấp chuột vào một nút sau đó mã cơ bản sẽ là:

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

Sau đó, người quản lý bố trí của bảng điều khiển chính sẽ quan sát kích thước ưa thích của bảng điều khiển đã thêm mới.

4

Sau khi thay đổi kích thước JFrame, sử dụng: yourframe.validate();

+1

Thay đổi kích thước khung hình sẽ khiến khung được xác thực. – camickr

3

Là một ví dụ cụ thể về camxc answer, chương trình bên dưới cho biết cách dựa vào kích thước ưa thích của các thành phần khi khung được thay đổi kích thước qua pack(). Nội dung giả là một loạt các nhãn, nhưng bất kỳ JComponent sẽ làm gì. Khi nội dung được tạo lại động, nó có thể thay đổi theo các điều kiện khác trong chương trình.

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; 
     } 
    } 
} 
Các vấn đề liên quan