Размещение кнопки на границе панели - PullRequest
2 голосов
/ 20 февраля 2010

Есть ли способ создать класс границы с кнопками на нем? Как это: пример

Одно важное условие - кнопки должны быть выровнены по границе, потому что панель может менять свой размер. Так что imho LayeredPane не подходит для этого - на это нет никакой надписи.

Есть одна идея - имитировать кнопки:

  • создать мой класс для панели
  • переопределить paintComponent () и нарисовать изображение кнопки поверх границы
  • переопределить событие мыши для него и использовать его как кнопку

Но. Может быть, есть способ поставить реальные кнопки на границе?

Ответы [ 3 ]

1 голос
/ 21 февраля 2010

Я не верю, что это возможно со стандартными границами, в основном потому, что Border не является Container, и поэтому в него не могут быть добавлены другие компоненты.

Но, если вы хотите перейти к реализации пользовательской границы, можно подделать границу, например:

private class BorderFaker extends JPanel
{
  public BorderFaker()
  {
    add( new JButton( "Faked!" ) );
  }

  @Override
  public void paintComponent( Graphics g )
  {
    super.paintComponent( g );
    drawFauxBorder( g );
  }

  private void drawFauxBorder( Graphics g )
  {
    g.setColor( UIManager.getColor( "border" ) );
    g.drawRect( 15, 15, getWidth() - 30, getHeight() - 30 );
  }
}

Это показывает, как вы могли бы сделать это, но это создает много проблем, таких как различие между компонентами, которые вы хотите внутри границы, по сравнению с границей (я только жестко закодировал "Faked!" кнопка для демонстрации). И вам все равно придется организовать расположение компонентов относительно «границы». Это потребовало бы некоторой тщательной обработки компонентов и некоторой удобной компоновки - как первоначально предлагалось @ trashgod .

Тем не менее, я не знаю, я бы предпочел сделать что-то подобное и подделать границу, чем подделывать рисунок кнопки. Если вы рисуете свою собственную кнопку, вы теряете соответствие текущему внешнему виду и ощущениям, и если вы не будете выполнять все то, что делает пользовательский интерфейс кнопки (обрабатывать опрокидывания, состояние охраны и т. Д.), Это вряд ли будет хорошо выглядеть.

1 голос
/ 21 февраля 2010

Класс Компонент Граница был разработан, чтобы позволить вам добавить компонент в качестве Границы для любого компонента.

Поведение по умолчанию - добавить компонент внутри существующей границы. Я не сделал полный тест, но похоже, что класс можно настроить для добавления компонента поверх существующей границы, выполнив:

// component.setLocation((int)x2, (int)y2);
component.setLocation(10, 0);
0 голосов
/ 20 февраля 2010

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

Добавление: возможно расширение AbstractBorder, как описано в Создание пользовательских границ , для достижения желаемого эффекта. Вы можете передать прослушиватель кнопки, как обсуждено здесь , или сохранить свой собственный список слушателей.

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