2016-08-01 18 views
0

私のアプリケーションの主要なGUIは、BorderLayoutを使ってフレームのコンテンツペインの中央にあるJDesktopPaneで構成されています。画面の右上にコンポーネントを配置し、このコンポーネント内のスペース内でJInternalFramesをドラッグできるようにしたいと考えています。コンポーネントが常に右上にあるJavaレイアウト

BorderLayoutのNORTHまたはEASTにコンポーネントを設定すると、領域全体が塗り潰されているようです。私はBorderLayoutが私が達成しようとしているもののための最高のレイアウトマネージャではないかもしれないと思っていますか?より良いアプローチに関する提案はありますか?

+0

1つのコンポーネントが右上に置かれた後に残っている_non-rectangular_スペースをすべて使用するレイアウトマネージャーを求めていますか?私はSwingについてよく分かりませんが、 'javax.swing.SpringLayout'を使う方法があるかどうかを見ていきます。 –

+0

@jameslargeこれは正しかったです。ありがとうございます。 – Tommo

+1

'BorderLayout'の' PAGE_START'に 'FlowLayout'を右寄せします(パネルにa)。フローレイアウトを使用して、右上に配置されたコンポーネントをパネルに追加します。 –

答えて

2

OverlayLayoutをご覧ください。コンポーネントを重ねて積み重ねることができます。

あなたが望むレイアウトを得るには、setAlignmentX(..)とsetAlignmentY(...) `メソッドを操作する必要があります。これらのアライメントがどのように連動するかは必ずしも直感的ではありませんが、コンポーネントを上/左に設定するのは比較的簡単です。あなたがプレイするためにここで

は少しデモです:
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class OverlayLayoutTest extends JPanel 
    implements ActionListener 
{ 
    JPanel green; 
    JPanel red; 
    JLabel greenLabel; 
    JLabel redLabel; 
    JComboBox greenAlignmentX; 
    JComboBox greenAlignmentY; 
    JComboBox redAlignmentX; 
    JComboBox redAlignmentY; 

    public OverlayLayoutTest() 
    { 
     setLayout(new BorderLayout(10, 10)); 
     add(createNorthPanel(), BorderLayout.NORTH); 
     add(createCenterPanel(), BorderLayout.CENTER); 
     add(createSouthPanel(), BorderLayout.SOUTH); 
    } 

    private JPanel createNorthPanel() 
    { 
     JPanel panel = new JPanel(); 

     panel.add(new JLabel("Green:")); 
     greenLabel = new JLabel(); 
     panel.add(greenLabel); 

     panel.add(new JLabel("Red:")); 
     redLabel = new JLabel(); 
     panel.add(redLabel); 

     return panel; 
    } 

    private JPanel createCenterPanel() 
    { 

     JPanel panel = new JPanel(); 
     panel.setLayout(new OverlayLayout(panel)); 
     panel.setBackground(Color.ORANGE); 
     panel.setPreferredSize(new Dimension(200, 200)); 

     red = new JPanel(); 
     red.setBackground(Color.RED); 
     red.setPreferredSize(new Dimension(50, 50)); 
     red.setMaximumSize(red.getPreferredSize()); 
     red.setMinimumSize(red.getPreferredSize()); 
     panel.add(red); 

     green = new JPanel(); 
     green.setBackground(Color.GREEN); 
     green.setPreferredSize(new Dimension(100, 100)); 
     green.setMaximumSize(green.getPreferredSize()); 
     green.setMinimumSize(green.getPreferredSize()); 
     panel.add(green); 

     JPanel wrap = new JPanel(); 
     wrap.add(panel); 
     return wrap; 
    } 

    private JPanel createSouthPanel() 
    { 
     JPanel panel = new JPanel(new GridLayout(1, 0, 10, 10)); 

     JPanel green = new JPanel(new GridLayout(0, 2, 5, 5)); 
     green.setBorder(new TitledBorder("Green Alignment")); 
     green.add(new JLabel("X Alignment:")); 
     greenAlignmentX = createComboBox(); 
     green.add(greenAlignmentX); 
     green.add(new JLabel("Y Alignment:")); 
     greenAlignmentY = createComboBox(); 
     green.add(greenAlignmentY); 
     panel.add(green); 

     JPanel red = new JPanel(new GridLayout(0, 2, 5, 5)); 
     red.setBorder(new TitledBorder("Red Alignment")); 
     red.add(new JLabel("X Alignment:")); 
     redAlignmentX = createComboBox(); 
     red.add(redAlignmentX); 
     red.add(new JLabel("Y Alignment:")); 
     redAlignmentY = createComboBox(); 
     red.add(redAlignmentY); 
     panel.add(red); 

     JButton reset = new JButton("Reset Alignment"); 
     reset.addActionListener(this); 
     panel.add(reset); 


     return panel; 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     green.setAlignmentX(((Float)greenAlignmentX.getSelectedItem())); 
     green.setAlignmentY(((Float)greenAlignmentY.getSelectedItem())); 
     red.setAlignmentX(((Float)redAlignmentX.getSelectedItem())); 
     red.setAlignmentY(((Float)redAlignmentY.getSelectedItem())); 
     JPanel parent = (JPanel)green.getParent(); 
     parent.revalidate(); 
/* 
     System.out.print(green.getAlignmentX() + " : "); 
     System.out.print(green.getAlignmentY() + " : "); 
     System.out.print(red.getAlignmentX() + " : "); 
     System.out.print(red.getAlignmentY() + " : "); 
     System.out.println(); 
*/ 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       greenLabel.setText(green.getLocation().toString()); 
       redLabel.setText(red.getLocation().toString()); 
      } 
     }); 

    } 

    private JComboBox createComboBox() 
    { 
     JComboBox<Float> comboBox = new JComboBox<Float>(); 

     comboBox.addItem(new Float(0f)); 
     comboBox.addItem(new Float(0.25f)); 
     comboBox.addItem(new Float(0.5f)); 
     comboBox.addItem(new Float(0.75f)); 
     comboBox.addItem(new Float(1.0f)); 
     comboBox.setSelectedItem(0.5f); 

     return comboBox; 
    } 

    private static void createAndShowUI() 
    { 
     JFrame frame = new JFrame("OverlayLayoutTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new OverlayLayoutTest()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
  1. は、両方のコンポーネントのために0.0にアライメントY値を設定し、両方のコンポーネント
  2. のために1.0にアライメントX値を設定

あなたが望むレイアウトを取得する必要があります。

編集:

はJInternalFrameのドラッグについての一部を逃しました。このため、JDesktopPaneを使用してドラッグをサポートしています。 JDesktopPaneはnullレイアウトを使用して、コンポーネントをドラッグできます。

デスクトップに別のコンポーネント(JInternalFrame以外)を追加することはできません。このコンポーネントのサイズ/位置をデスクトップの右上に表示するように設定するだけです。 をデスクトップペインに追加して、componentResizedイベントを待機する必要があります。このイベントが発生すると、右上にリセットするためにコンポーネントの位置を再計算する必要があります。

+0

これは、右上のコンポーネントの上にJInternalFrameをドラッグすると、コンポーネントが消えることを除いて、うまく動作しているようです。コンポーネントの上にマウスを重ねると、再度表示されるようです。 – Tommo

+0

@Tommo、編集を参照してください.OurlayLayoutは必要ありません。 – camickr

+0

助けてくれてありがとう! – Tommo

関連する問題