2015-02-04 3 views
1

У меня возникают проблемы с рисованием массива 2D JButton до JFrame. Все JButtons правильно рисуют, за исключением последнего, последний JButton, который будет отображаться, устанавливается на JFrame. Я установил ширину и высоту всех JButtons до 100x100, но последние JButton для визуализации не имеют ширины и высоты 100x100. Я напечатал свойства консоли, и он сказал, что высота и ширина кнопки были 494X496.Мои JButtons прослушиваются

Основной класс, который работает все:

package gameData; 

import javax.swing.*; 

public class GameRun { 

    JFrame frame; 
    ActionHandle AH = new ActionHandle(); 
    Screen screen = new Screen(); 

    public GameRun() { 
     beginSession(); 
     screen.renderScreen(frame, AH); 
    } 

    public void beginSession() { 
     JFrame frame = new JFrame(); 
     frame.setSize(500, 525);; 
     frame.setResizable(false); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setTitle("Game"); 
     this.frame = frame; 
    } 

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

} 

как JButtons нарисованы:

package gameData; 

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

public class Screen { 
    public void renderScreen(JFrame frame, ActionListener AL){ 
     JButton[][] button = new JButton[5][5]; 
     for(int i =0; i<button.length;i++){ 
      for(int j = 0; j<button[i].length; j++){ 
       button[i][j] = new JButton(i+" "+j); 
       button[i][j].setBounds(i*100, j*100, 100, 100); 
       button[i][j].addActionListener(AL); 
       frame.add(button[i][j]); 
      } 
     } 
    } 
} 

ответ

1
  1. JFrame использует BorderLayout по умолчанию, так что вы добавляете все кнопки в том же месте на раме, возможно, перекрывая их. Вместо этого вы должны использовать вместо этого GridBagLayout. См. How to Use GridBagLayout для получения более подробной информации.
  2. Вы должны переопределить метод getPreferredSize, если хотите повлиять на способ, которым располагаются кнопки.
  3. Вы должны действительно назвать setResizable, прежде чем установить размер кадра
  4. Вы должны использовать pack вместо setSize, кадры имеют оконные украшения, которые получают установленные внутри окна, а не добавляется к нему, это будет влиять на количество просмотра пространство у вас есть для содержания, pack будет делать все эти вычисления для вас
  5. вы должны создать/модифицируя UI изнутри контекста событий Диспетчерской тему см Initial Threads для более подробной информации

Например. ..

Buttons

import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

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

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      JButton[][] button = new JButton[5][5]; 
      for (int i = 0; i < button.length; i++) { 
       gbc.gridx = 0; 
       for (int j = 0; j < button[i].length; j++) { 
        button[i][j] = new JButton(i + " " + j) { 
         @Override 
         public Dimension getPreferredSize() { 
          return new Dimension(100, 100); 
         } 
        }; 
        add(button[i][j], gbc); 
        gbc.gridx++; 
       } 
       gbc.gridy++; 
      } 
     } 

    } 

} 

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

+0

для учебной цели, почему следует задавать «setResizable» перед установкой размера, если мы все равно установите его на false? –

+2

'setResizable' изменяет рамки оформления границ, меняя количество доступного пространства, доступного для области содержимого, но оно не всегда корректно обновляется. – MadProgrammer

+0

Итак, если, например, я называю 'setUndecorated (true)' right before, то это уже не имеет значения? –

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