2016-12-09 2 views
0

В настоящее время я кодирую проект java, и мне нужна именованная доска JPanel, чтобы содержать некоторые Плитки, которые сами являются JPanel, я добавляю их в макет соответствующего размера, но когда я добавляю все с кнопок в grouplayout в JFrame, только первая плитка имеет соответствующий размер, а другие имеют смехотворный размер, например, ширину 1p и высоту 50p или 1 * 1p.Панель GridLayout добавляет, не учитывая предпочитаемый размер

Не чувствую, что я пропускаю что-либо, все добавлено в JFrame и добавлено к правильной компоновке, с правильным количеством строк и строк, а в классе Tile задано 50 * 50p. Вот некоторые фрагменты кода, содержащие графические настройки, особенно Конструкторы:

Tile.java:

class Case extends JPanel 
{ 

private int _color; 
private boolean _star; 
private Case _casePere; 
private ArrayList<Case> _fils; 
private int _x,_y; 

public Case(int x, int y) 
{ 
    _color = 0; 
    _star = false; 
    _casePere = null; 
    _fils = new ArrayList<Case>(); 
    _x = x; 
    _y = y; 
    setPreferredSize(new Dimension(50,50)); 
    setMinimumSize(new Dimension(50,50)); 
    setBackground(Color.WHITE); 
} 

Board.java:

class Board extends JPanel{ 

private Case[][] _grid; 
private Case[] _starsp1; 
private Case[] _starsp2; 

// constructeur 
public Board(int nbStars, int length){ 



    _grid = new Case[length][length]; 
    _starsp1 = new Case[nbStars]; 
    _starsp2 = new Case[nbStars]; 

    //graphisme 
    Dimension d = new Dimension(50*length, length*50); 

    setBackground(Color.BLACK); 
    setPreferredSize(d); 


    GridLayout layout = new GridLayout(Constante.length, Constante.length,2 ,2); 
    setLayout(layout); 

    for(int y=0; y<length; ++y) 
    { 
     for(int x=0; x<length; ++x) 
     { 

      _grid[x][y] = new Case(x,y); 
      add(_grid[x][y]); 
     } 
    } 

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

Edit: я переопределение GetX и GetY в моем классе Case снова перекрывая, своего рода немой вопрос JPanel в один, спасибо за ответы

https://i.stack.imgur.com/BAosv.png

+0

Опубликовать надлежащую [mcve], которая демонстрирует проблему. Это создает рамку с только панелью панели и ее дочерними элементами. Сначала запустите эту часть кода, а затем добавьте другие компоненты. – camickr

ответ

2
setPreferredSize(d); 

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

Примечание. (В соответствии с приведенной ниже строкой) требуется расстояние между двумя компонентами, которые не учитываются в расчете на 2 пикселя. Поэтому пусть менеджер макетов выполняет свою работу.

GridLayout layout = new GridLayout(Constante.length, Constante.length,2 ,2); 

Мы не знаем, что такое Constante.length. Вы передаете переменную длины в свой класс, чтобы использовать эту переменную.

Кроме того, почему ваш класс Case имеет так много переменных экземпляра? Эти переменные никогда не используются в опубликованном коде. Возможно, у вас есть другие методы, которые вызывают проблемы с макетом. Например, не переопределяйте getX() или getY() эти методы используются менеджером компоновки.

+0

Эти две длины одинаковы, потому что конструктор вызывается с Constante.length, это своего рода грязный, извините, это своего рода результат попытки отладить эту проблему макета, извините. А что касается переменных, другие методы в Board и Case не делают ничего, связанные с графикой, поэтому я их вынул, чтобы сделать фрагмент коротким, может быть, я должен был очистить бесполезные переменные, извините еще раз – deathlab

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