2011-08-14 9 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); 
     } 

    } 

} 

あなたは私がボタンのクリックでサイズを変更したい見ることができるように。出来ますか?上記のコードは動作していない、私はサイズが変更されていないことを意味します。飛行中にサイズを変更するにはどうしたらいいですか?

ありがとうございます。 編集:

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()、これはパネルを入れ替え:

+2

これは助けることができるかもしれhttp://stackoverflow.com/questions/3889498/how-can-i-increase-decrease-size-of-window-on-click-event – Shadow

+0

+1ありがとうございました... –

+0

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

答えて

3

レイアウトマネージャを使用するときは、決してsetSize()を使用しないでください。サイズを決定するのはレイアウトマネージャの仕事です。推奨される最小または最大サイズを設定することによって、レイアウトマネージャにヒントを提供できます。ただし、コンポーネントとパネルは、使用しているレイアウトマネージャによって決定される適切なサイズで表示する必要があるため、これを行うことはお勧めしません。あなたはサイズを上書きしなかった場合、コードは次のようになります。

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

CardLayoutのジョブがパネルに追加されたすべてのパネルの最大サイズを決定することであるので、しかし、これはまだあなたが望むように動作しません。 CardLayoutを使用します。したがって、パネルからパネルにスワップするときは、個々のパネルのサイズを取得することはありません。これは、ユーザーがボタンを押すたびにフレームサイズが変更され続けるのを見たくないため、ユーザーにとってより良い体験です。

あなたは、フレームのサイズ変更にあなたがボタンをクリックするたびにしたいなかった場合は、基本的なコードは次のようになります。

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

そして、メインパネルのレイアウトマネージャはの推奨サイズを観察しますニューレイ追加パネル。

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

JFrameの、使用サイズ変更後: yourframe.validateを();

+1

フレームのサイズを変更すると、フレームが検証されます。 – camickr

3

camickrの具体的な例として、answerは、フレームがpack()でサイズ変更されるときに、コンポーネントの推奨サイズに依存する方法を示しています。 fauxのコンテンツは一連のラベルですが、いずれの場合も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; 
     } 
    } 
} 
関連する問題