Мои JPanels не отображаются так, как я хочу - PullRequest
2 голосов
/ 14 ноября 2011

Я пытаюсь сделать так, чтобы мое приложение выглядело примерно так:

How i want my application to look

Но когда я пытаюсь сделать это, я получаю что-то вроде этого: How my application looks

Вот код, который я использую для создания двух моих JPanels и как я добавляю кнопки и soo на ..

//This is the panel that shows the image
appletRunningPanel = new ImagePanel();
appletRunningPanel.setSize(600, 300);
appletRunningPanel.validate();

//This is the panels that shows the 3 buttons
appletRunningPanel2 = new Panel(new GridLayout(1, 3));
appletRunningPanel2.setSize(600, 300);
appletRunningPanel2.add(test1);
appletRunningPanel2.add(test2);
appletRunningPanel2.add(test3);
appletRunningPanel2.validate();

//Then i add them to the applet with this:
add(appletRunningPanel);
add(appletRunningPanel2);

Вот код для ImagePanel

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel() {
        setSize(600, 300);
        try {                
           image = ImageIO.read(getClass().getResourceAsStream("/res/TCHLogo.png"));
        } catch (IOException ex) {
             // handle exception...
            System.out.println(ex);
        }
     }

     @Override
     public void paintComponent(Graphics g) {
         super.paintComponent(g);
         g.drawImage(image, 0, 0, null);
     }

}

Ответы [ 3 ]

2 голосов
/ 14 ноября 2011

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

Разработка моего пользовательского интерфейса на Java, по моему опыту, сводится к смешиванию и подгонке менеджеров компоновки для достижения вашей общей цели. Есть несколько упрощенных менеджеров, таких как Mig Layout

Для вашего примера я бы сделал что-то вроде этого:

+----------------------------------------+
| panel1                                 |
|+--------------------------------------+|
|| panel2                               ||
|+--------------------------------------+|
+----------------------------------------+
+----------------------------------------+
| panel3                                 |
|+-----------++-----------++------------+|
|| panel4    || panel5    || panel6     ||
|+-----------++-----------++------------+|
+----------------------------------------+
  • panel1 имеет BorderLayout
  • panel2 это ваш ImagePanel и добавлен к panel1 через panel1.add(panel2, BorderLayout.CENTER);
  • panel3 это ваш GridLayout.
  • panel4, panel5 и panel6 - все по умолчанию (FlowLayout), и каждый из этих JPanel s будет содержать одну из ваших трех кнопок.

Затем вы можете добавить это на панель содержимого, установив для него Layout значение BorderLayout и добавив panel1 через getContentPane().add(panel1, BorderLayout.NORTH); и panel3 через getContentPane().add(panel3, BorderLayout.SOUTH);

Он не идеален, но он сделает ваш образ чище. Вы можете добавить гораздо больше, чтобы все выглядело лучше. Один из моих любимых менеджеров по раскладке - BoxLayout.

1 голос
/ 14 ноября 2011

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

На нижней панели GridLayout не учитывает предпочтительный размер компонентов (JButtons), он использует все пространство, доступное в разделе сетки.

Возможно, вам придется использовать разные менеджеры компоновки для каждой панели, и еще один для фрейма апплета.

0 голосов
/ 14 ноября 2011

Попробуйте добавить промежуточный JPanel, т.е.

JPanel appletRunningPanel2Wrapper = new JPanel();
appletRunningPanel2Wrapper.add(appletRunningPanel2);
add(appletRunningPanel2Wrapper);
...