2016-10-15 6 views
1

イメージをバックグラウンドとしてJLabelを設定し、それを上に置きたいので、オーバーレイレイアウトを持つパネルがあるJFrameがあります。私はフレームのサイズを画像のサイズと同じにして、それだけを置くと完全に収まりますが、私が上に何かを追加すると、イメージを右に、私が追加するコンポーネントの幅だけずらしますそれを右にカットします。これは、コンポーネントがシフトされた領域にない場合でも実行されます。コンポーネントは右にあり、ラベル上に正しく表示されていますが、イメージはまだシフトされています。オーバーレイレイアウトが背景イメージラベルをシフトするのを防ぐ

import java.awt.*;  
    import java.*; 
    import java.io.*; 
    import javax.swing.*; 
    import javax.swing.text.*; 
    import java.awt.event.*; 
    import javax.imageio.*; 
    import java.awt.image.*; 

    public class MainScreen extends JFrame{ 
     JButton button; 
     JPanel backgroundPanel, p, panel; 

     public MainScreen(ArrayList<Character> c){     
     JLabel label = new JLabel(new ImageIcon("house.jpg")); 
     button = new JButton("Button"); 

     backgroundPanel = new JPanel(); 
     p = new JPanel(); 
     panel = new JPanel(); 

     p.add(button); 
     panel.add(p); 

     panel.setOpaque(false); 
     p.setOpaque(false); 

     LayoutManager overlay = new OverlayLayout(backgroundPanel); 
     backgroundPanel.setLayout(overlay); 

     backgroundPanel.add(panel); 
     backgroundPanel.add(label);   

     add(backgroundPanel);  
     setLocationRelativeTo(null);     
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setResizable(false); 
     setSize(1200, 700); 
     setVisible(true); 
     } 

     public static void main(String[] args){ 
     MainScreen ms = new MainScreen(new ArrayList<Character>()); 
     } 
    } 
+1

インデントするコード行とブロックの論理的で一貫した形式を使用します。インデントは、コードの流れをより簡単にするためのものです。 –

+0

1)ところで - 3つ前の質問に答えがあるのはなぜですか?問題を解決するのに役立ちましたら[回答を受け入れてください](http://meta.stackexchange.com/a/5235/155831)してください。 2)*「フレームのサイズを画像のサイズと同じにします」*フレーム全体が小さすぎると画像が表示されません。フレーム装飾を考慮する必要があります。 –

+0

@AndrewThompsonもし何も書いていないときは、画像は完全に一致します –

答えて

1

が、私はそれの上に何かを追加する場合、それは私が追加し、あなたがする必要がある

右にそれを遮断コンポーネントの幅だけ右に画像をシフト2つのコンポーネントのalignmentX/Yプロパティを使用して再生し、目的のレイアウトを取得します。

すべてを0.5fに設定することから始めます。ここで

はあなたが効果を確認するためのプロパティを変更することができます小さなデモプログラムである:

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

別のオプションは、ちょうどあなたが(BorderLayoutは、GridBagLayoutの、FlowLayoutの好きにJLabelのレイアウトを設定することです)。その後、どのパネルでも同様に、ラベルにコンポーネントを直接追加できます。追加するコンポーネントは、ラベル内に完全に含まれている必要があります。これにより、OverlayLayoutを使用するよりも柔軟性が向上します。

関連する問題