2012-05-24 3 views
2

Хорошо, у меня есть Jpanel, который изображен белым на изображении ниже, используя оверлейную компоновку. Он содержит ScrollPane, содержащий изображение («Нет изображения») и JButton («Комментарий»).Проблемы с размещением JButton

enter image description here

Я хочу поместить эту кнопку в правом нижнем углу JPanel. Я попробовал несколько подходов к макету, и я не могу заставить его работать. В большинстве случаев кнопка перемещается примерно на 3/4 пути к юго-востоку, и я понятия не имею, почему.

Любая помощь очень ценится ..

+0

Какой макет менеджера вы используете, вы можете дать более подробную информацию о том, что Макеты вы пробовали? – Qwerky

+0

В панели контейнера используется макет Overlay Layout, а затем я добавляю ярлык (который содержит изображение) и кнопку. Затем я попытался использовать button.setAlignmentX(), например, чтобы выровнять кнопку, но она работает неправильно. Я также пробовал использовать макет спринта (так как это используется для остальных моих компонентов). Но снова я получаю странные эффекты. Как будто он не может пройти мимо определенной позиции. – user1224534

+0

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

3

Есть много возможных решений с использованием различных менеджеров компоновки. Я не знаю OverlayLayout, но мне нравится WindowBuilder Pro (бесплатно): https://developers.google.com/java-dev-tools/wbpro/ для справки с дизайном Swing.

Используя это, я написал реализацию SpringLayout вашего вопроса (SpringLayout выглядит как боль, с которой можно иметь дело без GUI-построителя).

JPanel panel = new JPanel(); 
SpringLayout sl_panel = new SpringLayout(); 
panel.setLayout(sl_panel); 

JButton button = new JButton("Comments"); 
sl_panel.putConstraint(SpringLayout.SOUTH, button, 0, SpringLayout.SOUTH, panel); 
sl_panel.putConstraint(SpringLayout.EAST, button, 0, SpringLayout.EAST, panel); 
panel.add(button); 

JScrollPane scrollPane = new JScrollPane(); 
sl_panel.putConstraint(SpringLayout.NORTH, scrollPane, 5, SpringLayout.NORTH, panel); 
sl_panel.putConstraint(SpringLayout.WEST, scrollPane, 3, SpringLayout.WEST, panel); 
sl_panel.putConstraint(SpringLayout.SOUTH, scrollPane, 3, SpringLayout.SOUTH, panel); 
sl_panel.putConstraint(SpringLayout.EAST, scrollPane, 3, SpringLayout.EAST, panel); 
panel.add(scrollPane); 

JLabel lblNewLabel = new JLabel(); 
lblNewLabel.setIcon(new ImageIcon(foo.class.getResource("sSdA3.png"))); 
scrollPane.setViewportView(lblNewLabel); 

Вот картина кода бега:

enter image description here

Вы можете увидеть кнопку (шахта, не картина твоя ...) парит над свитком-панели в дно. Мы могли бы корректировать поля выше, чтобы кнопка не плавала поверх полос прокрутки, но это просто, чтобы показать вам, где она находится на оси z.

+0

Спасибо за исправление ссылки на изображение @Bart. Я не был поклонником ограничения пользователя без изображения. :-) –

+0

Добро пожаловать в Натаниэль. –

+0

Спасибо, Натаниэль, используя SpringLayout Я успешно разместил кнопку: [Скриншот] (http://i.stack.imgur.com/Pscza.jpg) Однако у меня теперь есть еще одна проблема. Когда я использую следующую/предыдущую кнопку для просмотра следующего/предыдущего изображения в очереди изображений, я перерисовываю ярлык, используя: 'code'picLabel.setIcon (новый ImageIcon (путь));' code' Когда это произойдет , значок будет правильно изменен на новое изображение, но кнопка исчезнет. Я предполагаю, что новое изображение нарисовано над кнопкой. Как я могу это решить? – user1224534

1

Я Recommand использовать GridBagLayout вместо макета по умолчанию. С GridBagLayout вы все контролируете.
Вот ссылка, чтобы помочь вам: how to use GridBagLayout

+0

Спасибо, я посмотрю и отчитаю. – user1224534

1

Я бы сказал JPanel с BorderLayout с кнопкой, добавленной в EAST положения, и поставить эту панель в главном контейнере (с BorderLayout) в SOUTH положения.

Таким образом, вы получите:

------------- 
|   | 
|   | 
| Image | 
|   | 
|-----------| 
|______Button 
+0

Спасибо, я посмотрю, что сработает – user1224534

1

Проверить SpringLayout. Он позволяет размещать элемент на определенном расстоянии от СЕВЕРНОГО, ЗАПАДНОГО, ВОСТОЧНОГО или ЮГО-го компонента. Ваш код будет выглядеть следующим образом:

SpringLayout layout = new SpringLayout(); 
setLayout(layout); 
... 
add(_button); 
... 
layout.putConstraint(SpringLayout.EAST, _button, -20, SpringLayout.EAST, this); 
layout.putConstraint(SpringLayout.SOUTH, _button, -20, SpringLayout.SOUTH, this); 
3

Добавьте первый JPanel с изображением на CENTER положении панели содержимого и просто установить макет вашего JPanel, чтобы FlowLayout.RIGHT и добавить свой JButton к нему, теперь добавьте это JPanel к PAGE_END позиции BorderLayout вашего контента. Посмотрите на этот пример

import java.awt.*; 
import java.awt.event.*; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class ApplicationCloseExample 
{ 
    private Image image; 
    private static final String HTML = 
     "<html>" + 
     "<style type'text/css'>" + 
     "body, html { padding: 0px; margin: 0px; }" + 
     "</style>" + 
     "<body>" + 
     "<img src='http://pscode.org/media/starzoom-thumb.gif'" + 
     " width=320 height=240>" + 
     ""; 

    private void displayGUI() 
    { 
     final JFrame frame = new JFrame("Application Close Example"); 

     frame.addWindowListener(new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent we) 
      { 
       int result = JOptionPane.showConfirmDialog(
           frame, "Do you want to Exit ?" 
           , "Exit Confirmation : ", JOptionPane.YES_NO_OPTION); 
       if (result == JOptionPane.YES_OPTION)    
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       else if (result == JOptionPane.NO_OPTION) 
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
      } 
     }); 

     JPanel contentPane = new JPanel(); 
     contentPane.setOpaque(true); 
     JLabel label = new JLabel(HTML); 
     contentPane.add(label); 

     JPanel bottomPanel = new JPanel(); 
     bottomPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5)); 
     JButton button = new JButton("Comment"); 
     bottomPanel.add(button); 

     frame.getContentPane().add(contentPane, BorderLayout.CENTER); 
     frame.getContentPane().add(bottomPanel, BorderLayout.PAGE_END); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new ApplicationCloseExample().displayGUI(); 
      } 
     }); 
    } 
} 

Вот результат:

RIGHT JBUTTON

3

Вы упомянули, используя OverlayLayout; вы хотите, чтобы кнопка фактически перекрывала изображение?

Если это не важно для вас, используйте одно из других полезных предложений, так как они намного проще. Но если вы действительно хотите, чтобы кнопка перекрывала изображение, вот одно решение: используйте JLayeredPane для второго слоя JPanel s, который, в свою очередь, выложит кнопку и изображение. К сожалению, JLayeredPane не имеет менеджера компоновки, поэтому необходимо добавить компонентный прослушиватель, чтобы изменить размер JPanel s при изменении размера JLayeredPane.

Вот SSCCE:

public class SSCCE { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Container contentPane = frame.getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 

     final JLayeredPane layeredPane = new JLayeredPane(); 
     contentPane.add(layeredPane,BorderLayout.CENTER); 

     final JPanel btnPane = new JPanel(new GridBagLayout()); 
     btnPane.setOpaque(false); 

     JButton btn = new JButton("Comment"); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.anchor = GridBagConstraints.SOUTHEAST; 
     btnPane.add(btn,gbc); 

     final JPanel lblPane = new JPanel(new GridBagLayout()); 
     lblPane.setBackground(Color.CYAN); 

     JLabel lbl = new JLabel("No Image Available"); 
     gbc = new GridBagConstraints(); 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     gbc.anchor = GridBagConstraints.CENTER; 
     lblPane.add(lbl,gbc); 

     layeredPane.add(btnPane,0); 
     layeredPane.add(lblPane,1); 
     layeredPane.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 
       lblPane.setBounds(0, 0, layeredPane.getWidth(), layeredPane.getHeight()); 
       btnPane.setBounds(0, 0, layeredPane.getWidth(), layeredPane.getHeight()); 
      } 
     }); 


     frame.setSize(300,200); 
     frame.setVisible(true); 
    } 

} 
Смежные вопросы