2013-09-07 2 views
2

Broken buttonsИзображение включено У меня есть еще одна проблема, когда мои кнопки идут в верхнем правом углу после ввода пользователем имени. На данный момент текст отображается в графическом интерфейсе на стороне LEFT центра, который, кажется, будет «WEST», когда я ставлю «CENTER». Код:Проблемы с компоновкой кнопок с JFrame

public TheDungeon() 
{ 
    setTitle("InsertGameNameHere"); 
    setSize(750, 600); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLayout(new BorderLayout()); 
    setLocationRelativeTo(null); 

    buildButtonPanel();    

    characterInfoPanel = new JLabel("<html>Character information will go here</html>"); 
    gameScreen = new JLabel(); 
    inventoryPanel = new JLabel("<html>This is for the inventory</html>"); 

    add(gameScreen, BorderLayout.CENTER); 
    add(buttonPanel, BorderLayout.SOUTH); 

    setVisible(true);  

    //Program run 
    userName(); 
    gameScreen.setText("<html>Welcome "+name+", to the game that has no name!</html>"); 
    classWindow(); 
} 

private void buildButtonPanel() 
{ 
    // Create a panel for the buttons. 
    buttonPanel = new JPanel(); 

    // Create the buttons. 
    b1 = new JButton("Button 1"); 
    b2 = new JButton("Button 2"); 
    b3 = new JButton("Button 3"); 
    b4 = new JButton("Button 4"); 
    b5 = new JButton("Button 5"); 

    // Add the buttons to the button panel. 
    buttonPanel.add(b1); 
    buttonPanel.add(b2); 
    buttonPanel.add(b3); 
    buttonPanel.add(b4); 
    buttonPanel.add(b5); 
} 


private void userName() { 
name = JOptionPane.showInputDialog("What will your name be?"); 
} 

ответ

4

Я не знаю, почему ваша программа ведет себя, как это, кажется, с тех пор, когда я бежал, он не сделал этого. Вы можете проверить свой код, чтобы убедиться, что это код, который вы публикуете здесь. Но, несмотря на это, у меня есть некоторые предложения:

  • Лучше всего не устанавливать размеры ничего, а чтобы компоненты и менеджеры по макетам сделали это за вас.
  • Рассмотрите, если вы должны переопределить getPreferredSize(), если вам нужно более полно контролировать размер компонента.
  • Позвоните по номеру pack() в окно верхнего уровня после добавления всех компонентов и перед вызовом setVisible(true). Это скажет менеджерам макетов делать все возможное.
  • Избегайте расширения JFrame, так как вам редко приходится переопределять одно из своих врожденных проявлений.
  • Если вы добавили или удалили компоненты или каким-то образом изменили их предпочтительные размеры после рендеринга окна верхнего уровня, вы должны позвонить revalidate(), а затем repaint() в контейнере компонента, чтобы контейнер переформатировал компоненты, которые он удерживает, а затем перерисовать их.

Например:

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.*; 

public class TheDungeon2 extends JPanel { 
    private static final int PREF_W = 750; 
    private static final int PREF_H = 600; 
    private static final String[] BUTTON_LABELS = {"Button 1", "Button 2", 
     "Button 3", "Button 4", "Button 5"}; 
    private static final String WELCOME_TEXT = "Welcome %s to the game that has no name!"; 

    private JLabel welcomeLabel = new JLabel("", SwingConstants.CENTER); 
    private String name; 

    public TheDungeon2() { 
     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     for (String buttonLabel : BUTTON_LABELS) { 
     JButton button = new JButton(buttonLabel); 
     buttonPanel.add(button); 
     } 

     setLayout(new BorderLayout()); 
     add(welcomeLabel, BorderLayout.CENTER); 
     add(buttonPanel, BorderLayout.PAGE_END); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    public void getAndSetName() { 
     name = JOptionPane.showInputDialog(this, "What will your name be?"); 
     welcomeLabel.setText(String.format(WELCOME_TEXT, name)); 
    } 

    private static void createAndShowGui() { 
     TheDungeon2 dungeon2 = new TheDungeon2(); 

     JFrame frame = new JFrame("Nameless Game"); 

     dungeon2.getAndSetName(); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(dungeon2); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

Это работало красиво! Как я могу добавить прослушиватель действий к кнопкам? У меня есть следующий код позже в моей программе, но проблема с кодом, который вы указали выше, кнопки не имеют конкретных имен. Не могли бы вы показать код того, как это сделать? 'warriorButton.addActionListener (новый ActionListener() { общественного недействительными actionPerformed (ActionEvent ЭВТ) { Класс_пользователей = "Воин"; classWindow.dispose();}} );' переносы строк не будет работать, поэтому я не могу сделать новую строку. Я пробовал
и, похоже, не работает. Сожалею! – Xearta

+0

@Xearta: приведенный выше пример был написан с сокращенными сокращениями, чтобы просто показать проблемы форматирования графического интерфейса, в том числе с использованием массива String для создания кнопок. Вам придется расширять и изменять собственное решение. Что касается многострочного дисплея, рассмотрите возможность использования JTextArea. Вы можете изменить его внешний вид, чтобы он соответствовал значению JLabel, вызывая его методы. –

3

Я тестировал код с помощью метода пустой classWindow() и кнопки правильно расположены на юге,

для выдачи CENTER, вы должны поместить что-то в WEST, чтобы ваш текст был центрирован (даже пустая панель), иначе CENTER займет все место,

Посмотрите на это, я добавил эту строку:

add(new JButton("a button for test"),BorderLayout.WEST); 

и вот результат:

demo

+2

Другим вариантом является 'JLabel.setText (« TextToDisplay », JLabel.CENTER)'.Не нужно добавлять компонент в 'WEST/предпочитаемое имя LINE_START' сейчас :-) –

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