2015-11-24 5 views
1

Итак, я перехожу в GUI на Java и пытаюсь создать простое главное меню для таймера. Все хорошо, пока я не попытался добавить фон для графического интерфейса. Добавление фона работает, однако теперь все остальные компоненты исчезли (кнопка). Как я могу это исправить?JFrame setContentPane скрывает другие компоненты

EDIT: Вот мой новый код.

общественный класс MainMenu {

// JFrame = the actual menu/frame. 
private JFrame frame; 
// JLabel = provides text instructions or information on a GUI — 
// display a single line of read-only text, an image or both text and an image. 
private JLabel background; 
// JButton = button. 
private JButton alarmClockButton; 

// Constructor to create menu 
public MainMenu() { 
    frame = new JFrame("Alarm Clock"); 
    alarmClockButton = new JButton("Timer"); 
    // Add an event to clicking the button. 
    alarmClockButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      // TODO: CHANGE TO SOMETHING NICER 
      JOptionPane.showMessageDialog(null, "This feature hasn't been implemented yet.", "We're sorry!", 
        JOptionPane.ERROR_MESSAGE); 
     } 
    }); 
    // Creating the background 
    try { 
     background = new JLabel(new ImageIcon(ImageIO.read(getClass() 
       .getResourceAsStream("/me/devy/alarm/clock/resources/Background.jpg")))); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    frame.setLayout(new FlowLayout()); 
    frame.setContentPane(background); 
    frame.add(alarmClockButton); 
    frame.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); 
    frame.setVisible(true); 
    frame.setSize(450, 400); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    alarmClockButton.setForeground(Color.RED); 
} 

}

Спасибо!

+2

Вы устанавливаете область содержимого как JLabel. Затем вы вызываете frame.add (панель), но это просто пытается добавить панель в панель содержимого - вы не можете добавить панель в JLabel. – FredK

+0

Возможно, вы захотите добавить это в форму ответа. –

ответ

3
frame.setContentPane(background); 

Вы можете использовать метку в панели содержимого. Проблема в том, что метка не использует диспетчер компоновки по умолчанию.

Вам нужно добавить:

background.setLayout(new BorderLayout()); // or whatever layout you want 
frame.setContentPane(background); 

Теперь вы можете добавить кнопку непосредственно к раме. Вам не нужна панель.

Или, если вы хотите получить фантазию, вы можете использовать Background Panel, который дает вам возможность масштабировать или черепицей фоновое изображение.

+0

Привет, я редактировал главный пост с моим новым кодом, он все еще, похоже, имеет ту же проблему. Есть идеи? – TheCoder24

+0

@ TheCoder24, вы не сделали того, что я предложил. Почему вы устанавливаете макет рамки? Разве я не предлагал установить макет фона? Вы хотите, чтобы метка была фоном, поэтому перед добавлением каких-либо компонентов в фрейм вам нужно сделать панель содержимого кадра. – camickr

+0

ahh моя ошибка, извините за это! Теперь он работает. Не возражаете ли вы объяснить, что именно .setContentPane(); даже делает? Как я и понятия не имею. Благодаря! – TheCoder24

0

Вместо того, чтобы в качестве ContentPane JLabel, вы можете обернуть JLabel в JPanel, затем добавьте JPanel как ContentPane:

public class MainMenu { 

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

    // JFrame = the actual menu/frame. 
    private JFrame frame; 
    private JPanel panel; 
    private JPanel bkgPanel; 
    // JLabel = provides text instructions or information on a GUI — 
    // display a single line of read-only text, an image or both text and an 
    // image. 
    private JLabel background; 
    // JButton = button. 
    private JButton alarmClockButton; 

    // Constructor to create menu 
    public MainMenu() { 
     frame = new JFrame("Alarm Clock"); 
     panel = new JPanel(); 
     bkgPanel = new JPanel(); 
     alarmClockButton = new JButton("Timer"); 
     // Add an event to clicking the button. 
     alarmClockButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       // TODO: CHANGE TO SOMETHING NICER 
       JOptionPane.showMessageDialog(null, "This feature hasn't been implemented yet.", "We're sorry!", 
         JOptionPane.ERROR_MESSAGE); 
      } 
     }); 
     // Creating the background 
     try { 
      background = new JLabel(new ImageIcon(
        ImageIO.read(getClass().getResourceAsStream("/me/devy/alarm/clock/resources/Background.jpg")))); 
      bkgPanel.add(background); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     frame.setContentPane(bkgPanel); 
     frame.add(panel); 
     panel.add(alarmClockButton); 
     frame.setVisible(true); 
     frame.setSize(450, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     alarmClockButton.setForeground(Color.RED); 
    } 
} 
+0

На самом деле это не фоновое изображение. Поскольку 'bkgPanel' имеет« FlowLayout »в качестве макета,« панель »добавляется рядом с изображением, а не поверх него. –

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