2013-12-09 4 views
0

Я уже делал GUI на моем компьютере, но с этой программой я хотел попробовать реализовать GridBag, чтобы я мог сделать простую игру. У меня нет подсказки, почему он не работает. Это код:GUI, не отображающийся на моем экране

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

public class GridBagTest extends JFrame{ 
    public static void main(String[] args){ 
     new GridBagTest(); 
    } 

    public void GridBagTest(){ 
     JButton atk, mag, fort, pot1, pot2, flee; 
     JPanel gamePanel = new JPanel(); 
     gamePanel.setLayout(new GridBagLayout()); 

     JFrame gameFrame = new JFrame("FightQuest"); 
     gameFrame.getContentPane().add(gamePanel); 
     gameFrame.setSize(800, 600); 
     gameFrame.pack(); 
     gameFrame.setVisible(true); 

     atk = new JButton("Strike"); 
     mag = new JButton("Magic"); 
     fort = new JButton("Fortify"); 
     pot1 = new JButton("Potion 1"); 
     pot2 = new JButton("Potion 2"); 
     flee = new JButton("Flee"); 
     addItem(gamePanel, atk, 0, 0, 1, 1, GridBagConstraints.SOUTHEAST); 
     addItem(gamePanel, mag, 1, 0, 1, 1, GridBagConstraints.SOUTH); 
     addItem(gamePanel, fort, 2, 0, 1, 1, GridBagConstraints.SOUTHWEST); 
     addItem(gamePanel, pot1, 0, 1, 1, 1, GridBagConstraints.NORTHEAST); 
     addItem(gamePanel, pot2, 1, 1, 1, 1, GridBagConstraints.NORTH); 
     addItem(gamePanel, flee, 2, 1, 1, 1, GridBagConstraints.NORTHWEST); 

    } 

    private void addItem(JPanel p, JComponent c, int x, int y, int width, int height, int align){ 
     GridBagConstraints gc = new GridBagConstraints(); 
     gc.gridx = x; 
     gc.gridy = y; 
     gc.gridwidth = width; 
     gc.gridheight = height; 
     gc.weightx = 100.0; 
     gc.weighty = 100.0; 
     gc.insets = new Insets(0, 0, 0, 0); 
     gc.anchor = align; 
     gc.fill = GridBagConstraints.NONE; 
     p.add(c, gc); 
    } 
} 

Я не знаю, если это делает никакой разницы, но я получил большую часть этого кода из справочника Java для Java 6, хотя я бегу Java 7, так как это было моя школа. Я также выполняю весь свой код в операционной системе XFCE.

+2

1) Для лучшей помощи рано , опубликуйте [SSCCE] (http://sscce.org/). 2) См. [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/a/9554657/418556) –

+0

У меня нет понятия, как сделать это короче, удаляя вещи из кода doesn ' t создайте GUI. Мне нужно, чтобы другие люди говорили мне, как сократить или удлинить код. – JavaNoob

+1

Хорошо поздравляю, вы полностью понимаете 1 из 4 вещей, которые делают SSCCE. Теперь посмотрим на *** другие 3. *** –

ответ

1

Изменение этой линии

public void GridBagTest() 

в

public GridBagTest() 

Конструктор не имеет возвращаемого типа. Также вы должны позвонить pack() и setVisible(true) по размеру и показать компоненты после добавления их в контейнер.

Также обратите внимание, что расширение в этом случае не требуется.

Изменить

public class GridBagTest extends JFrame 

в

public class GridBagTest{ 

Изменения показаны в коде:

public class GridBagTest{ 
    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new GridBagTest(); 
      } 
     }); 
    } 

    public GridBagTest(){ 
     JButton atk, mag, fort, pot1, pot2, flee; 
     JPanel gamePanel = new JPanel(); 
     gamePanel.setLayout(new GridBagLayout()); 

     JFrame gameFrame = new JFrame("FightQuest"); 
     gameFrame.getContentPane().add(gamePanel); 
     gameFrame.setSize(800, 600); 


     atk = new JButton("Strike"); 
     mag = new JButton("Magic"); 
     fort = new JButton("Fortify"); 
     pot1 = new JButton("Potion 1"); 
     pot2 = new JButton("Potion 2"); 
     flee = new JButton("Flee"); 
     addItem(gamePanel, atk, 0, 0, 1, 1, GridBagConstraints.SOUTHEAST); 
     addItem(gamePanel, mag, 1, 0, 1, 1, GridBagConstraints.SOUTH); 
     addItem(gamePanel, fort, 2, 0, 1, 1, GridBagConstraints.SOUTHWEST); 
     addItem(gamePanel, pot1, 0, 1, 1, 1, GridBagConstraints.NORTHEAST); 
     addItem(gamePanel, pot2, 1, 1, 1, 1, GridBagConstraints.NORTH); 
     addItem(gamePanel, flee, 2, 1, 1, 1, GridBagConstraints.NORTHWEST); 
     gameFrame.pack(); 
     gameFrame.setVisible(true); 

    } 

    private void addItem(JPanel p, JComponent c, int x, int y, int width, int height, int align){ 
     GridBagConstraints gc = new GridBagConstraints(); 
     gc.gridx = x; 
     gc.gridy = y; 
     gc.gridwidth = width; 
     gc.gridheight = height; 
     gc.weightx = 100.0; 
     gc.weighty = 100.0; 
     gc.insets = new Insets(0, 0, 0, 0); 
     gc.anchor = align; 
     gc.fill = GridBagConstraints.NONE; 
     p.add(c, gc); 
    } 
} 

И вы получите свой результат:

enter image description here

+0

Это сработало. Спасибо. – JavaNoob

+0

@JavaNoob посмотреть обновление! – nachokk

0

Не уверен, если это ваша проблема, но ваши звонки на gameFrame.setSize(800, 600); и gameFrame.pack(); кажутся противоречивыми, так как pack() будет вновь установить размер в соответствии с текущим содержимым кадра. (Что в точке, которую вы называете pack(), ничего)

Кстати, вы также должны создать и обновить компоненты Swing в Диспетчерской теме событий.

+0

Я удалил pack() из моего кода, но это не привело к появлению GUI. – JavaNoob

0

Первое, что я ищу при рассмотрении таких проблем, как запуск приложения. Обратите внимание, что you are not properly launching your GUI. Вы должны убедиться, что графический интерфейс запускается на EDT (Thread Dispatch Thread).

Ниже приведен пример запуска вашего конкретного графического интерфейса.

SSCCE:

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

/** 
* http://stackoverflow.com/questions/20478125/gui-not-showing-on-my-screen/20478279#20478279 
*/ 
public class Q20478125 { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Q20478125(); 
      } 
     }); 
    } 

    public Q20478125() { 
     JButton atk, mag, fort, pot1, pot2, flee; 
     JPanel gamePanel = new JPanel(); 
     gamePanel.setLayout(new GridBagLayout()); 
     gamePanel.setPreferredSize(new Dimension(800, 600)); 

     JFrame gameFrame = new JFrame("FightQuest"); 
     gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     gameFrame.getContentPane().add(gamePanel); 
     gameFrame.pack(); 
     gameFrame.setVisible(true); 

     atk = new JButton("Strike"); 
     mag = new JButton("Magic"); 
     fort = new JButton("Fortify"); 
     pot1 = new JButton("Potion 1"); 
     pot2 = new JButton("Potion 2"); 
     flee = new JButton("Flee"); 
     addItem(gamePanel, atk, 0, 0, 1, 1, GridBagConstraints.SOUTHEAST); 
     addItem(gamePanel, mag, 1, 0, 1, 1, GridBagConstraints.SOUTH); 
     addItem(gamePanel, fort, 2, 0, 1, 1, GridBagConstraints.SOUTHWEST); 
     addItem(gamePanel, pot1, 0, 1, 1, 1, GridBagConstraints.NORTHEAST); 
     addItem(gamePanel, pot2, 1, 1, 1, 1, GridBagConstraints.NORTH); 
     addItem(gamePanel, flee, 2, 1, 1, 1, GridBagConstraints.NORTHWEST); 

    } 

    private void addItem(JPanel p, JComponent c, int x, int y, int width, int height, int align) { 
     GridBagConstraints gc = new GridBagConstraints(); 
     gc.gridx = x; 
     gc.gridy = y; 
     gc.gridwidth = width; 
     gc.gridheight = height; 
     gc.weightx = 100.0; 
     gc.weighty = 100.0; 
     gc.insets = new Insets(0, 0, 0, 0); 
     gc.anchor = align; 
     gc.fill = GridBagConstraints.NONE; 
     p.add(c, gc); 
    } 
} 
0

Вы создаете конструктор psudo для размещения void до GridBagTest(), который указывает, что GridBagTest() является функцией не конструктором. Таким образом, звоните:

new GridBagTest().GridBagTest(); 

внутри основная функция.Что, очевидно, вы не должны делать: а удалить тип возвращаемого void:

public GridBagTest(){ //<--- void is removed 


     JFrame gameFrame = new JFrame("FightQuest"); 
     // other code 
} 

Однако, всегда начинают свою программу из EDT, представив его на EventQueue с помощью SwingUtilities.invokeLater(Runnable):

SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 

       new GridBagTest(); 
      } 
     }); 
Смежные вопросы