2013-06-28 4 views
0

Я создаю gui, который имеет 2 панели. Когда gui сначала загружается, отображается только одна панель, и при нажатии кнопки отображается новая панель. Проблема в том, что на второй панели, когда она загружается, кнопки невидимы и отображаются только при наведении курсора мыши на них. Вдобавок к этому, когда вы перемещаете экран, они снова становятся невидимыми, и их нужно снова зависнуть для отображения. Я действительно не знаю, что попробовать, поскольку я посмотрел на методы создания нескольких панелей, и это кажется лучшим способом сделать это, а также, как это, кнопки внедряются так же, как я реализовал их для 1-й панели, и они сделать правильно.JButtons не отображается до наведения мыши

Полный код

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Gui { 
    private JFrame frame; 
    private JPanel panel1; 
    private JPanel panel2; 
    private JButton btnShip1, btnShip2, btnShip3, btnTutorial, btnLeftControl, btnHull, btnTargeting, btnRadar, btnWarning, btnRightControl; 
    private JTextField txtCharacterName, txtShipName; 
    private JLabel welcome, background; 

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

    public Gui(){ 
     createWindow(); 
     addButtons(); 
     addFields(); 
     addWelcome(); 

     frame.add(panel1); 
     frame.setVisible(true); 

     addBackground(); 
     addShipControls(); 
    } 

    public void createWindow(){ 
     frame = new JFrame(); 
     frame.setTitle("Space Battle"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(642, 518); 

     panel1 = new JPanel(); 
     panel1.setLayout(null); 
     panel1.setBackground(Color.decode("#242627")); 

     panel2 = new JPanel(); 
     panel2.setLayout(null); 
     panel2.setBackground(Color.decode("#242627")); 
    } 

    public void addButtons(){ 
     btnShip1 = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/cruiserSelectBtn.jpg"); 
      btnShip1.setIcon(img); 
     } 
     catch (Exception e) {} 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/button_1_hover.gif"); 
      btnShip1.setRolloverIcon(img); 
     } 
     catch (Exception e) {} 
     btnShip1.setBounds(246,0,380,160); 
     btnShip1.setMargin(new Insets(0, 0, 0, 0)); 
     btnShip1.addActionListener(new cruiserSelectHandler()); 
     btnShip1.setBorder(null); 
     panel1.add (btnShip1); 

     btnShip2 = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/fighterSelectBtn.jpg"); 
      btnShip2.setIcon(img); 
     } 
     catch (Exception e) {} 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/button_2_hover.gif"); 
      btnShip2.setRolloverIcon(img); 
     } 
     catch (Exception e) {} 
     btnShip2.setBounds(246,160,380,160); 
     btnShip2.setMargin(new Insets(0, 0, 0, 0)); 
     btnShip2.addActionListener(new fighterSelectHandler()); 
     btnShip2.setBorder(null); 
     panel1.add (btnShip2); 

     btnShip3 = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/battleSelectBtn.jpg"); 
      btnShip3.setIcon(img); 
     } 
     catch (Exception e) {} 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/button_3_hover.gif"); 
      btnShip3.setRolloverIcon(img); 
     } 
     catch (Exception e) {} 
     btnShip3.setBounds(246,320,380,160); 
     btnShip3.setMargin(new Insets(0, 0, 0, 0)); 
     btnShip3.addActionListener(new battleSelectHandler()); 
     btnShip3.setBorder(null); 
     panel1.add (btnShip3); 

     btnTutorial = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/tutorialBtn.jpg"); 
      btnTutorial.setIcon(img); 
     } 
     catch (Exception e) {} 
     btnTutorial.setBounds(5,426,234,49); 
     btnTutorial.setMargin(new Insets(0, 0, 0, 0)); 
     panel1.add (btnTutorial); 
    } 

    public void addFields(){ 
     txtCharacterName = new JTextField("Insert Character Name"); 
     txtCharacterName.setBounds(12,260,220,35); 
     panel1.add(txtCharacterName); 

     txtShipName = new JTextField("Insert Ship Name"); 
     txtShipName.setBounds(12,315,220,35); 
     panel1.add(txtShipName); 
    } 

    public void addWelcome(){ 
     welcome = new JLabel(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/welcome.jpg"); 
      welcome.setIcon(img); 
     } 
     catch (Exception e) {} 
     welcome.setBounds(0,0,247,229); 
     panel1.add(welcome); 
    } 
    //Class used to change panels 
    class cruiserSelectHandler implements ActionListener { 
     public void actionPerformed(ActionEvent even) { 
      frame.add(panel2); 
      panel1.setVisible(false); 
     } 
    } 

    class fighterSelectHandler implements ActionListener { 
     public void actionPerformed(ActionEvent even) { 
      frame.add(panel2); 
      panel1.setVisible(false); 
     } 
    } 

    class battleSelectHandler implements ActionListener { 
     public void actionPerformed(ActionEvent even) { 
      frame.add(panel2); 
      panel1.setVisible(false); 
     } 
    } 

    public void addBackground(){ 
      //Is the background interfering? 
     background = new JLabel(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/background.jpg"); 
      background.setIcon(img); 
     } 
     catch (Exception e) {} 
     background.setBounds(0,0,640,480); 
     panel2.add(background); 
    } 

    //Class used to add controls/buttons 
    public void addShipControls(){ 
     btnLeftControl = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/left_controls.png"); 
      btnLeftControl.setIcon(img); 
     } 
     catch (Exception e) {} 
     btnLeftControl.setBounds(-8,319,131,160); 
     btnLeftControl.setMargin(new Insets(0, 0, 0, 0)); 
     btnLeftControl.setBorder(null); 
     panel2.add (btnLeftControl); 

     btnHull = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/hull_controls.png"); 
      btnHull.setIcon(img); 
     } 
     catch (Exception e) {} 
     btnHull.setBounds(123,319,91,160); 
     btnHull.setMargin(new Insets(0, 0, 0, 0)); 
     btnHull.setBorder(null); 
     panel2.add (btnHull); 

     btnTargeting = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/targeting_controls.png"); 
      btnTargeting.setIcon(img); 
     } 
     catch (Exception e) {} 
     btnTargeting.setBounds(214,319,202,160); 
     btnTargeting.setMargin(new Insets(0, 0, 0, 0)); 
     btnTargeting.setBorder(null); 
     panel2.add (btnTargeting); 

     btnWarning = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/warning_controls.png"); 
      btnWarning.setIcon(img); 
     } 
     catch (Exception e) {} 
     btnWarning.setBounds(416,411,86,68); 
     btnWarning.setMargin(new Insets(0, 0, 0, 0)); 
     btnWarning.setBorder(null); 
     panel2.add (btnWarning); 

     btnRadar = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/radar_idea.gif"); 
      btnRadar.setIcon(img); 
     } 
     catch (Exception e) {} 
     btnRadar.setBounds(416,319,86,92); 
     btnRadar.setMargin(new Insets(0, 0, 0, 0)); 
     btnRadar.setBorder(null); 
     panel2.add (btnRadar); 

     btnRightControl = new JButton(); 
     try 
     { 
      ImageIcon img = new ImageIcon ("resources/right_controls.png"); 
      btnRightControl.setIcon(img); 
     } 
     catch (Exception e) {} 
     btnRightControl.setBounds(502,319,131,160); 
     btnRightControl.setMargin(new Insets(0, 0, 0, 0)); 
     btnRightControl.setBorder(null); 
     panel2.add (btnRightControl); 

    } 
} 
+0

почта полный код пожалуйста. – Makky

+0

'btnLeftControl.setBounds (-8,319,131,160);', 'background.setBounds (0,0,640,480);' не выглядит хорошо. Трудно сказать без кода –

+0

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

ответ

3

при нажатии кнопки на новую панель отображается.

Проблема заключается в том:

  1. вы используете нулевой макет
  2. вы добавить два различных панелей к раме.

По умолчанию Swing рисует компоненты в обратном порядке, чтобы они были добавлены.

Поэтому, когда вы добавляете панель 1, это единственная панель рамы, поэтому она окрашена.

Затем вы нажимаете кнопку и добавляете панель2. Итак, Swing рисует панель2, а затем перекрашивает панель1 сверху, поэтому панель2 скрыта. Когда вы наводите курсор на кнопку, она появляется, потому что кнопки прослушивают события mouseEntered, и кнопка перерисовывается.

При изменении размера экранная панель2 окрашивается, а затем панель 1 окрашивается, и у вас снова возникает проблема.

Решение заключается в использовании надлежащего менеджера макетов. В вашем случае вы должны использовать макет карты. Макет карты будет менять панели, чтобы одновременно видеть только одну панель. Прочтите учебник Swing по телефону Using Card Layout. Затем избавьтесь от всех нулевых макетов и методов setBounds().