2014-01-14 20 views
-1

У меня есть класс с именем BoardGUI, продленный от JFrame, в конструкторе я сделал JPanel с двумя кнопками в нем. Я добавил эту панель в свой кадр. Всякий раз, когда я запускаю эту программу, кнопки становятся невидимыми. Когда я наводил курсор мыши на кнопки, они становятся видимыми. Код выглядит следующим образом:Как установить JPanel над JFrame?

public class BoardGUI extends JFrame { 
Play pieces; 
JButton a=new JButton("Undo"); 
JButton r=new JButton("replay"); 
JPanel jp=new JPanel(); 

public BoardGUI() { 
    pieces = new Play(); 
    setTitle("Checkers Game"); 
    setSize(645, 700); 
    setVisible(true); 

    jp.setLayout(new FlowLayout()); 
    jp.setPreferredSize(new Dimension(645,35)); 
    a.setVisible(true); 
    r.setVisible(true); 
    jp.add(a); 
    jp.add(r); 
    add(jp,BorderLayout.SOUTH); 

Я также использую метод перерисовки в своей программе. Может ли кто-нибудь указать на мою ошибку и предложить какое-либо решение для этого?

+0

Можете ли вы предоставить простой тест через общедоступный статический метод void? – PKopachevsky

+0

1) Чтобы лучше помочь, отправьте [MCVE] (http://stackoverflow.com/help/mcve) ближайшую попытку (в отличие от фрагментов кода). 2) Предоставьте ASCII-искусство (или изображение с простым рисунком) графического интерфейса пользователя, поскольку оно должно отображаться в наименьшем размере и (при изменении размера) с дополнительной шириной/высотой. –

+0

Что касается макета, вы можете получить некоторые идеи из [этой шахматной доски] (http://stackoverflow.com/a/21096455/418556). В этом [кратком примере] (http://stackoverflow.com/a/16058759/418556) показано, как объединить компоненты с изображением BG. –

ответ

5

У меня есть класс с именем BoardGUI простирался от JFrame, в конструкторе я внесший JPanel с двумя кнопками в нем. Я добавил эту панель в мой кадр. Всякий раз, когда я запускаю эту программу, кнопки становятся невидимыми. Как Я приношу курсор мыши над кнопками, которые они видят.

  • setVisible(true); должна быть последней строки кода в конструкторе, потому что вы добавили JComponents к уже видимых JFrame,

  • или вызвать revalidate() и repaint() в том случае, JComponents добавляются к видимым GUI свинг

  • нет причин звонить по телефону a.setVisible(true); или r.setVisible(true); по стандарту JComponents, потому что JComponents являются visible(true) по умолчанию в сравнении с Top Level Containers, то вам нужно позвонить JFrame/JDialog/JWindow.setVisible(true);

EDIT

(i used the very first suggestion you gave. problem remains the same.) - например

enter image description here

из кода

import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MyGridLayout { 

    private JFrame frame = new JFrame("GridLayout, JButtons, etc... "); 
    private JPanel panel = new JPanel(new GridLayout(8, 8)); 

    public MyGridLayout() { 
     for (int row = 0; row < 8; row++) { 
      for (int col = 0; col < 8; col++) { 
       JButton button = new JButton("(" + (row + 1) + "/" + (col + 1) + ")"); 
       button.putClientProperty("column", col); 
       button.putClientProperty("row", row); 
       button.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         JButton btn = (JButton) e.getSource(); 
         System.out.println(
           "clicked column : " 
           + btn.getClientProperty("column") 
           + ", row : " + btn.getClientProperty("row")); 
        } 
       }); 
       panel.add(button); 
      } 
     } 
     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocation(150, 150); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       MyGridLayout myGridLayout = new MyGridLayout(); 
      } 
     }); 
    } 
} 
+0

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

+1

, тогда есть еще один ***, для лучшей помощи скорее опубликуйте [MCVE] (http://stackoverflow.com/help/mcve), короткий, выполнимый, компилируемый с жестко заданным значением в локальных переменных, см. [Начальный поток] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html) также очень важно – mKorbel

+1

* «тогда есть еще один ***» * (Chuckle);) –

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