2013-11-27 5 views
1

나는이 응용 프로그램을 가지고 있는데, 나는 BorderLayout을 사용하는 JFrame을 가지고 있습니다. JFrame은 JPanel이고, JPanel은 MigLayout을 사용하고 있습니다. JButton을 화면 왼쪽 하단에 유지하려고 시도하고 CSS의 "position : fixed"속성과 비슷한 효과를냅니다.스윙 - 응용 프로그램에서 스크롤 할 때 항상 JButton을 페이지에 머물게 할 수 있습니다.

코드로이 효과를 얻을 수있는 방법에 대한 팁은 무엇입니까?

다른 소스에서 시도한 JLayeredPane 코드이지만 여전히 작동하지 않습니다.

private JPanel contentPane; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { 
        if (info.getName().equals("Nimbus")) { 
         UIManager.setLookAndFeel(info.getClassName()); 
         break; 
        } 
       } 
       MainFrame frame = new MainFrame(); 
       ForumMainPage panel = new ForumMainPage(frame); 

       panel.setFocusable(true); 
       panel.requestFocusInWindow(); 
       frame.add(jLabelOnJButton()); 
       frame.setContentPane(panel); 
       frame.pack(); 


       frame.setVisible(true); 


      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public MainFrame() { 


    Toolkit tk = Toolkit.getDefaultToolkit(); 
    Dimension dim = tk.getScreenSize(); 

    this.setSize(dim); 
    this.setUndecorated(true); 
    this.setExtendedState(Frame.MAXIMIZED_BOTH); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    this.setLayout(new BorderLayout()); 
    this.add(jLabelOnJButton(),BorderLayout.CENTER); 

} 
private static JComponent jLabelOnJButton(){ 
     JLayeredPane layers = new JLayeredPane(); 

     JLabel label = new JLabel("label"); 
     JButton button = new JButton("button"); 

     label.setBounds(40, 20, 100, 50); 
     button.setBounds(100, 20, 150, 75); 

     layers.add(label, new Integer(200)); 
     layers.add(button, new Integer(100)); 

     return layers; 
    } 
    } 

미리 감사드립니다. OverlayLayout에를 사용하여

+0

자세한 내용은 How to use Root Panes은 ... – MadProgrammer

답변

1

당신은 프레임의 유리 창에 버튼을 추가 할 수 있습니다. 이것은 당신이 유리 창에 스크롤 창에 상대를 추적 할 필요가 같이 일어날 수 있도록 약간의 작업이 필요하지만 그것은 원하는 효과

overlay button

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class OverlayButton { 

    public static void main(String[] args) { 
     new OverlayButton(); 
    } 

    public OverlayButton() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JScrollPane sp; 
     private JButton btn; 
     private JTextArea ta; 

     private JPanel glassPane; 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      btn = new JButton("Print"); 
      ta = new JTextArea(10, 20); 

      BufferedReader br = null; 
      try { 
       br = new BufferedReader(new FileReader(new File("Script.txt"))); 
       String text = null; 
       while ((text = br.readLine()) != null) { 
        ta.append(text + "\n"); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 
       try { 
        br.close(); 
       } catch (Exception e) { 
       } 
      } 

      ta.setCaretPosition(0); 
      sp = new JScrollPane(ta); 
      glassPane = new JPanel() { 

       @Override 
       public void doLayout() { 
        Point p = sp.getLocation(); 
        Dimension dim = sp.getSize(); 
        p = SwingUtilities.convertPoint(sp, p, this); 

        btn.setSize(btn.getPreferredSize()); 
        int barWidth = sp.getVerticalScrollBar().getWidth(); 
        int barHeight = sp.getHorizontalScrollBar().getHeight(); 
        int x = p.x + (dim.width - btn.getWidth()) - barWidth; 
        int y = p.y + (dim.height - btn.getHeight()) - barHeight; 
        btn.setLocation(x, y); 
       } 

      }; 
      glassPane.setOpaque(false); 
      glassPane.add(btn); 
      glassPane.addComponentListener(new ComponentAdapter() { 

       @Override 
       public void componentResized(ComponentEvent e) { 
        e.getComponent().doLayout(); 
       } 

      }); 
      add(sp); 
     } 

     @Override 
     public void addNotify() { 
      super.addNotify(); 
      SwingUtilities.getRootPane(this).setGlassPane(glassPane); 
      glassPane.setVisible(true); 
      glassPane.revalidate(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.dispose(); 
     } 

    } 

} 

를 살펴 보자 달성한다 당신은 프레임 유리 창에있는 버튼을 추가 할 수

+0

내 ForumMainPage 패널 위에 많은 그가 지금 – user3038858

+0

작업을 나타납니다 몇 가지 다른 해킹이 있지만 가장 일반적인 것입니다.) – MadProgrammer

1

시도 :

JPanel contentPane = new JPanel(); 
contentPane.setLayout(new OverlayLayout(ContentPane)); 
frame.setContentPane(panel); 

JButton button = new JButton(...); 
button.setAlignmentX(0.0f); 
button.setAlignmentY(1.0f); 
contentPane.add(button); 

ForumMainPage panel = new ForumMainPage(frame); 
contentPane.add(panel); 
+0

바 (순수한 빈 공간) 덕분에 어이 어떤 이유로 :( – user3038858