Java: Swing: установить положение JButton - PullRequest
2 голосов
/ 18 декабря 2010

Я хотел реализовать следующий макет:

--------------------------------------------
|                                          |
|                                          |
|                                          |
|                                          |
|                                          |
|                 ----------               |
|                 |   OK   |               |
|                 ----------               |
|                                          |
--------------------------------------------

Я хотел установить размер кнопки, и она должна быть центрирована в южном положении JFrame, но она не должна иметь полную ширинуJFrame, и он не должен быть полностью в нижней части JFrame, он должен иметь «запас».Также было бы возможно установить абсолютную позицию пикселя кнопки, потому что JFrame имеет фиксированную ширину / высоту.На данный момент кнопка имеет полную ширину / высоту JFrame.Обратите внимание, что у JFrame есть фоновое изображение.Мой код:

JFrame j = new JFrame("Foobar");
BufferedImage myImage = null;
try {
    myImage = ImageIO.read(new File("background.png"));
} catch (Exception ex) {}

JPanel p = new ImagePanel(myImage);
p.setLayout(new BorderLayout());

JButton button = new JButton("OK");
button.setSize(80, 200);
button.setFont(new Font("Arial", 1, 40));
p.add(button);
f.add(p);

class ImagePanel extends JPanel {
    private Image image;
    public ImagePanel(Image image) {
        this.image = image;
    }
    @Override
    protected void paintComponent(Graphics g) {
        g.drawImage(image, 0, 0, null);
    }
}

Ответы [ 5 ]

4 голосов
/ 18 декабря 2010

Комбинация простых менеджеров компоновки должна сделать свое дело.Например, основной JPanel может иметь EmptyBorder, куда вы добавляете соответствующие поля и можете использовать BorderLayout.Затем добавьте южную панель JPanel, которая использует FlowLayout, организованный FlowLayout.CENTER (по умолчанию), и вы можете добавить свой JButton к этой южной панели.Не забудьте вызвать пакет и убедиться, что все JPanels вызывают setOpaque (false).Например:

  JFrame f = new JFrame("Foobar");
  BufferedImage myImage = null;
  try {
      myImage = ImageIO.read(new File("background.png"));
  } catch (Exception ex) {}

  JPanel p = new ImagePanel(myImage);
  p.setLayout(new BorderLayout());
  int gap = 15;
  p.setBorder(BorderFactory.createEmptyBorder(gap, gap, gap, gap));

  JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); // new FlowLayout not needed
  southPanel.setOpaque(false);
  JButton button = new JButton("OK");
  //button.setSize(80, 200);
  button.setPreferredSize(new Dimension(80, 200)); // ?? I don't like this.
  button.setFont(new Font("Arial", 1, 40));

  southPanel.add(button);
  p.add(southPanel, BorderLayout.SOUTH);
  f.add(p);
  f.pack(); // call after everything has been added
  f.setLocationRelativeTo(null); // to center
  f.setVisible(true);
2 голосов
/ 09 августа 2012
GroupLayout gl_panel = new GroupLayout(panel);
    gl_panel.setHorizontalGroup(
        gl_panel.createParallelGroup(Alignment.LEADING)
            .addGroup(gl_panel.createSequentialGroup()
                .addGap(188)
                .addComponent(**button**)
                .addContainerGap(189, Short.MAX_VALUE))
    );
    gl_panel.setVerticalGroup(
        gl_panel.createParallelGroup(Alignment.LEADING)
            .addGroup(gl_panel.createSequentialGroup()
                .addGap(106)
                .addComponent(**button**)
                .addContainerGap(171, Short.MAX_VALUE))
    );
2 голосов
/ 18 декабря 2010

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

Вот часть учебника по Swing, которой вы можете следовать: http://download.oracle.com/javase/tutorial/uiswing/layout/custom.html

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

  • установить макет главной панели на BorderLayout
  • добавить панель в SOUTH часть главной панели
  • установить макет этой панели на FlowLayout
  • установить EmptyBorder для этой панели и установить нижнее значение (это ваше поле)
  • добавить кнопку на эту панель

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

1 голос
/ 18 декабря 2010

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

Требуется немного времени, чтобы понять, как его использовать, но как только вы поймете принципы, это фантастический инструмент в вашем арсенале.

0 голосов
/ 18 декабря 2010

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

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