2015-08-25 4 views
1

Я хочу, чтобы все мои кнопки были одинакового размера. Один с текстом «Открыть Сохранить» является самым широким, поэтому я хочу использовать его как метрику для изменения размера других кнопок. Однако, когда у меня есть эта строка кода в программе, кнопка не будет отображаться: newButton.setPreferredSize (openSaveButton.getSize());Изменение размера JButton заставляет его исчезать

Вот полная программа до сих пор:

public class Project1 implements ActionListener { 

    // The frames 
    private JFrame mainMenu = new JFrame("Main Menu"); 
    private JPanel mainPanel = new JPanel(); 
    private JFrame game = new JFrame("Game"); 
    private JPanel gamePanel = new JPanel(); 
    // Controls 
    private JButton newButton = new JButton("New"); 
    private JButton openSaveButton = new JButton("Open Save"); 
    private JButton exitButton = new JButton("Exit"); 
    private JTextArea textArea = new JTextArea(); 

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

// Constructors 
    public Project1() { 

     mainPanel.setLayout(new GridBagLayout()); 
     addItem(mainPanel, newButton, 0, 0, 1, 1, GridBagConstraints.CENTER); 
     newButton.addActionListener(this); 
     newButton.setPreferredSize(openSaveButton.getSize()); 
     addItem(mainPanel, openSaveButton, 0, 1, 1, 1, GridBagConstraints.CENTER); 
     openSaveButton.addActionListener(this); 
     addItem(mainPanel, exitButton, 0, 2, 1, 1, GridBagConstraints.CENTER); 
     exitButton.addActionListener(this); 

     mainMenu.add(mainPanel, BorderLayout.NORTH); 
     openFrame(mainMenu, 10, 10, JFrame.EXIT_ON_CLOSE); 

     gamePanel.setLayout(new GridBagLayout()); 
     addItem(gamePanel, textArea, 0, 0, 1, 1, GridBagConstraints.CENTER); 
     openFrame(game, 200, 10, JFrame.DO_NOTHING_ON_CLOSE); 

    } 

// Setters 
// Getters 
// ActionListener override 
    public void actionPerformed(ActionEvent e) { 

     if (e.getSource() == newButton) { 
      newGame(); 
     } else if (e.getSource() == openSaveButton) { 
      openFile(); 
     } else if (e.getSource() == exitButton) { 
      System.exit(0); 
     } 
    } 

// Other functions and procedures 
    private void openFrame(JFrame what, int x, int y, int operation) { 

     what.pack(); 
     what.setLocation(x, y); 
     what.setVisible(true); 
     what.setResizable(false); 
     what.setDefaultCloseOperation(operation); 
    } 

    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(5, 5, 5, 5); 
     gc.anchor = align; 
     gc.fill = GridBagConstraints.NONE; 
     p.add(c, gc); 
    } 

    private void newGame() { 

    } 

    private void openFile() { 

    } 

} 

Вот два снимки экрана, что происходит, без линии и с:

without resizingwith resizing

+0

Один плюс к MadProgrammer. Также обязательно вызывайте 'setResizable (false)' *** BEFORE ****, вызывающий 'pack()'. –

ответ

1

Однако, когда у меня есть эта строка кода в программе, кнопка не будет отображаться: newButton.setPreferredSize (openSaveButton.getSize());

Тогда не делайте этого.

Когда вы звоните openSaveButton.getSize(), openSaveButton не имеет размера, это 0x0, так что теперь вы говорите менеджеру макета по newButton должен иметь предпочтительный размер 0x0, который он любезно претендует, и теперь вы кнопка больше не видна.

Теперь, если я правильно понимаю, что вы пытаетесь сделать, попробуйте перебрать gc.fill = GridBagConstraints.NONE; в gc.fill = GridBagConstraints.HORIZONTAL; в ваш метод addItem.

См How to Use GridBagLayout для более подробной информации

Вы также можете взглянуть на Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?, The Use of Multiple JFrames, Good/Bad Practice? и Initial Threads

+0

Я попытался поместить команду resize после размещения openSaveButton. Это все еще размер 0x0? Когда его размеры устанавливаются? – failure

+1

Во-первых, просто не делайте этого, не делайте этого. Контейнер будет выложен, когда он будет впервые реализован на экране или когда он был отмечен как недействительный (требуется макет). Итак, у вас теперь есть проблема с уловом. Вы не можете установить размер компонента до тех пор, пока контейнер не будет выложен, но макет не может произойти до тех пор, пока не будут установлены подсказки по размеру компонента ... как я уже сказал, используйте вместо этого ограничения макета – MadProgrammer

+0

Итак, следуя некоторым из того, что вы «Если бы измерения не применялись до тех пор, пока они не появятся на экране, я пошел вперед и поместил строки после того, как будут вызваны фреймы. Это сработало отлично. Я рассмотрю ограничения компоновки в другой раз, теперь мне просто нужно завершить проект. – failure