2015-01-03 3 views
2

Я действительно борюсь с созданием сложного макета. Вот изображение того, что я хочу в конце: overpower card game tabletopJava LayoutManagers с JPanels

Я попытался разделить и победить, создавая небольшие панели и помещая их в другие панели. Сначала я вычислил borderlayout для основной панели контейнера, которая находится в исходном JFrame, с кучей GridBagLayouts для деталей в этих панелях. Когда это не сработало, я подумал, что я попробую свою руку в любом GridBagLayout. Прямо сейчас моя цель - отобразить верхнюю группу панелей/карт персонажа и местоположения в их правильном соотношении сторон (около 4: 3) и правильно изменить размер (поддерживая соотношение сторон как можно лучше) при изменении размера окна , То, что я получаю, это супер маленькая квадратная панель для каждой карты, когда открывается окно. Я хочу, чтобы они начинались с соотношения сторон (4: 3).

Я правильно понял?

Должен ли я придерживаться всех GridBagLayouts?

Если нет, то какие комбинации макетов вы видите, что может сработать?

И наконец, возможно, самое главное, почему они не начинаются с правильной ширины сетки или сетки?

Было бы неплохо, если бы все карты поддерживали соотношение сторон 4: 3 или 3: 4, когда окно около 4: 3.

public class OverPower {  
    public static void main(String[] args) {   
     JFrame table = new JFrame(); 
     table.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     table.setLayout(new BorderLayout()); 

     JPanel contentPane = new OppCharsPanel(); 
     table.setContentPane(contentPane); 
     table.setLocationByPlatform(true); 

     table.pack(); 
     table.setLocationRelativeTo(null); 
     table.setVisible(true); 
    }  
} 

public class OppCharsPanel extends JPanel { 
    public OppCharsPanel() { 
     setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.insets = new Insets(20, 15, 20, 15); 
     gbc.fill = GridBagConstraints.BOTH; 
     gbc.gridwidth = 4; 
     gbc.gridheight = 3; 
     gbc.weightx = 4.0; 
     gbc.weighty = 3.0; 

     //back row 
     gbc.gridx = 4; 
     gbc.gridy = 0; 
     JPanel oppHomebase = new JPanel(); 
     oppHomebase.setBackground(Color.RED); 
     this.add(oppHomebase, gbc); 

     gbc.gridx = 8; 
     gbc.gridy = 0; 
     JPanel oppReserve = new JPanel(); 
     oppReserve.setBackground(Color.RED); 
     this.add(oppReserve, gbc); 


     //front row 
     gbc.gridx = 0; 
     gbc.gridy = 3; 
     JPanel oppBattlesite = new JPanel(); 
     oppBattlesite.setBackground(Color.RED); 
     this.add(oppBattlesite, gbc); 

     gbc.gridx = 4; 
     gbc.gridy = 3; 
     JPanel oppChar1 = new JPanel(); 
     oppChar1.setBackground(Color.RED); 
     this.add(oppChar1, gbc); 

     gbc.gridx = 8; 
     gbc.gridy = 3; 
     JPanel oppChar2 = new JPanel(); 
     oppChar2.setBackground(Color.RED); 
     this.add(oppChar2, gbc); 

     gbc.gridx = 12; 
     gbc.gridy = 3; 
     JPanel oppChar3 = new JPanel(); 
     oppChar3.setBackground(Color.RED); 
     this.add(oppChar3, gbc); 
    } 
} 
+0

Я думаю, что ваша идея начать работу с отдельными компонентами была правильной, но используйте GridBagLayout для выкладки подкомпонентов – MadProgrammer

+0

@MadProgrammer не то, что я делаю в моем представленном коде ??? –

+0

Уверен, но сломайте его, у вас есть 4 основных контейнера, в пределах которых есть два подконтейнера, а у вас есть фактический контент, посмотрите на каждый слой по очереди и сосредоточьтесь на этих требованиях отдельно. – MadProgrammer

ответ

3

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

Area # 1

enter image description here

Итак, в основном, он имеет три основных компонента (каждая цветная секция - это собственная панель), которые могут использоваться с BorderLayout

Площадь # 2

enter image description here

Так вот, у вас есть еще три зоны/панелей, из-за различные требования к вертикали, я мог бы возникнуть соблазн использовать GridBagLayout, это позволит вам определить больше места в двух верхних компонентов, тогда нижний ...

Area # 3

enter image description here

Итак, опять три основных направления. Здесь я буду испытывать соблазн снова использовать BorderLayout. Для indivdual контейнеров, я мог бы использовать GridBagLayout или Rob Camick's WrapLayout (для прокладки изображения внутри каждой из трех областей)

Scaling

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

+0

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

+1

Да, менеджер компоновки может сделать, например, квадраты компонентов, пусть сам фактический компонент отобразит изображение в этом пространстве – MadProgrammer

+0

Итак, оставьте последний вопрос. Кажется ли это хорошим способом сделать карточную игру, подобную этой ... т. Е. Разместите места, где могут идти карты, а затем создавать и размещать их в этих местах по мере необходимости? –

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