2016-03-12 2 views
1

Я думаю, что все правильно написано в коде, мне просто нужно знать, как сортировать разные слои.Как я могу переместить JLabel перед ImageIcon?

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.event.ActionEvent; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.ImageIcon; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.KeyStroke; 

class FullSceenToggleAction extends AbstractAction { 

    private JFrame frame; 
    private GraphicsDevice fullscreenDevice; 

    public FullSceenToggleAction(JFrame frame) { 
     this(frame, GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()); 
    } 

    public FullSceenToggleAction(JFrame frame, GraphicsDevice fullscreenDevice) { 
     this.frame = frame; 
     this.fullscreenDevice = fullscreenDevice; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     frame.dispose(); 
     if (frame.isUndecorated()) { 
      fullscreenDevice.setFullScreenWindow(null); 
      frame.setUndecorated(false); 
     } else { 
      frame.setUndecorated(true); 
      fullscreenDevice.setFullScreenWindow(frame); 
     } 
     frame.setVisible(true); 
     frame.repaint(); 
    } 

} 

public class Main { 

    public static final void addKeyBinding(JComponent c, String key, final Action action) { 
     c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(key), key); 
     c.getActionMap().put(key, action); 
     c.setFocusable(true); 
    } 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("Fullscreen Toggle Test"); 
     Container contentPane = frame.getContentPane(); 
     contentPane.add(new JLabel("Hey"), BorderLayout.CENTER); 
     frame.add(new JLabel(new ImageIcon("C:/Users/SamBr/Pictures/DesktopBackgrounds/image.png"))); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(960, 600); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.setTitle("Virtual World"); 
     addKeyBinding(frame.getRootPane(), "F11", new FullSceenToggleAction(frame)); 
    } 

} 

Когда я запускаю код, который я вижу изображение, но нет текста «Эй» перед ним или где-нибудь на экране я не понимаю, почему это не показано, или как я могу сделать его видимым перед изображение.

+0

в части дизайна, щелкните правой кнопкой мыши компонент, и должна быть возможность получить компонент спереди или сзади. –

+0

Я уже говорил вам о проблеме, но вы никогда не комментировали меня, как если бы вы проигнорировали ее. Если вы не понимаете комментарий, пожалуйста, не просто игнорируйте его, просьба уточнить. –

+0

@Sam Если вы используете макет, вы не можете разместить свои компоненты в нужном месте (и большинство макетов не допускают частичного перекрытия компонентов). Позиции компонентов будут определяться макетом. Если вам интересно, чтобы 2 изображения перекрывались и перемещали их куда угодно, вы можете рассмотреть обычную картину. Вы можете посмотреть здесь: [Изображение, которое перекрывается] (http: // stackoverflow.ком/вопросы/35711891/как к Create-A-фон-и-передний план-образ-который-перекрывающийся/35711894 # 35711894). – user3437460

ответ

3

Я сказал вам причину до - вы добавляете два компонента в область содержимого, а второй компонент перемещает первый.

Обратите внимание, что эти две строк коды добавить компонент в же контейнера, фрейм в ContentPane:

contentPane.add(new JLabel("Hey"), BorderLayout.CENTER); 
    frame.add(new JLabel(
      new ImageIcon("C:/Users/SamBr/Pictures/DesktopBackgrounds/image.png"))); 

Поскольку согласно the JFrame API:

Для удобства надстройки, remove и setLayout этого класса переопределяются, поэтому они делегируют вызовы соответствующим методам ContentPane.

Кроме того, ContentPane использует BorderLayout по умолчанию, и если вы добавляете компонент без использования 2-постоянных параметров, компоненты добавляются по умолчанию в расположение BorderLayout.CENTER.

Если вы хотите как для отображения, то либо

  1. Используйте другой макет из умолчанию контейнера BorderLayout
  2. Держите BorderLayout, но добавить свои два JLabel к двум разным адресам BorderLayout, таких как BorderLayout. ЦЕНТР, BorderLayout.PAGE_START ...
  3. Используйте для хранения Панель со слоями слои
  4. Нарисуйте изображение в изображении рисования методом paintComponent JPanel, и добавить «Эй» JLabel к этому JPanel
  5. .... другие решения.
+1

(1+) для настойчивости. – camickr

1

Кто знает, что вы пытаетесь сделать.

Но вот некоторые примеры отображения текста на этикетке в разных местах, в зависимости от ваших требований:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class LabelImageText extends JPanel 
{ 
    public LabelImageText() 
    { 
     JLabel label1 = new JLabel(new ColorIcon(Color.ORANGE, 100, 100)); 
     label1.setText("Easy Way"); 
     label1.setHorizontalTextPosition(JLabel.CENTER); 
     label1.setVerticalTextPosition(JLabel.CENTER); 
     add(label1); 

     // 

     JLabel label2 = new JLabel(new ColorIcon(Color.YELLOW, 200, 150)); 
     label2.setLayout(new BoxLayout(label2, BoxLayout.Y_AXIS)); 
     add(label2); 

     JLabel text = new JLabel("More Control"); 
     text.setAlignmentX(JLabel.CENTER_ALIGNMENT); 
     label2.add(Box.createVerticalGlue()); 
     label2.add(text); 
     label2.add(Box.createVerticalStrut(10)); 

     // 

     JLabel label3 = new JLabel(new ColorIcon(Color.GREEN, 200, 150)); 
     label3.setLayout(new GridBagLayout()); 
     add(label3); 

     JLabel text3 = new JLabel(); 
     text3.setText("<html><center>Text<br>over<br>Image<center></html>"); 
     text3.setLocation(20, 20); 
     text3.setSize(text3.getPreferredSize()); 
     label3.add(text3); 

     // 

     JLabel label4 = new JLabel(new ColorIcon(Color.CYAN, 200, 150)); 
     add(label4); 

     JTextPane textPane = new JTextPane(); 
     textPane.setText("Add some text that will wrap at your preferred width"); 
     textPane.setEditable(false); 
     textPane.setOpaque(false); 
     SimpleAttributeSet center = new SimpleAttributeSet(); 
     StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); 
     StyledDocument doc = textPane.getStyledDocument(); 
     doc.setParagraphAttributes(0, doc.getLength(), center, false); 
     textPane.setBounds(20, 20, 75, 100); 
     label4.add(textPane); 
    } 

    public static class ColorIcon implements Icon 
    { 
     private Color color; 
     private int width; 
     private int height; 

     public ColorIcon(Color color, int width, int height) 
     { 
      this.color = color; 
      this.width = width; 
      this.height = height; 
     } 

     public int getIconWidth() 
     { 
      return width; 
     } 

     public int getIconHeight() 
     { 
      return height; 
     } 

     public void paintIcon(Component c, Graphics g, int x, int y) 
     { 
      g.setColor(color); 
      g.fillRect(x, y, width, height); 
     } 
    } 

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

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

Простое решение использует только одну метку как с иконкой и текстом. Другие используют другие компоненты и используют возможности менеджеров компоновки.

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