Иконка в заголовке заголовка - PullRequest
6 голосов
/ 25 марта 2010

Привет, возможно ли разместить значок в заголовке заголовка с названием, например, следующий код:


import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class TitledExample extends JPanel {

  public TitledExample() {
    super(true);

    this.setLayout(new GridLayout(1, 1, 5, 5));

    JLabel label = new JLabel("Titled Border");
    label.setHorizontalAlignment(JLabel.CENTER);

    TitledBorder titled = new TitledBorder("Image here ?? Title");
    label.setBorder(titled);

    add(label);
  }

Спасибо, ура

Ответы [ 4 ]

9 голосов
/ 26 марта 2010

Попробуйте создать подкласс TitledBorder и переопределите метод paintBorder:

 @Override
 public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) 
 {
     super.paintBorder(c, g, x, y, width, height);

     // Now use the graphics context to draw whatever needed
     g.drawImage(img, xImageOffset, yImageOffset, imgWidth, imgHeight, observer);
 }

Не отчаянно уверен, что это совершенно правильный вызов метода, но вы поняли идею; получив доступ к объекту Graphics, вы можете рисовать практически все, что вам нужно.

6 голосов
/ 26 марта 2010

Это, вероятно, не то, что вы хотите, но, возможно, подойдет Unicode ™ глиф или два.

Приложение: @ rhu's подход предпочтительнее, но я не удержался, попробовав это:

enter image description here

TitledBorder titled = BorderFactory.createTitledBorder("\u2615");
titled.setTitleFont(new Font(Font.Dialog, Font.PLAIN, 32));
titled.setTitleColor(Color.blue);
label.setBorder(titled);
3 голосов
/ 27 июня 2016

Вы можете использовать отражение, чтобы получить доступ к JLabel, используемому TitledBorder.

try
{
    // Get the field declaration
    Field f = TitledBorder.class.getDeclaredField("label");
    // Make it accessible (it normally is private)
    f.setAccessible(true);
    // Get the label
    JLabel borderLabel = (JLabel)f.get(titledBorder);
    // Put the field accessibility back to default
    f.setAccessible(false);
    // Set the icon and do whatever you want with your label
    borderLabel.setIcon(myIcon);
}
catch(Exception e)
{
    e.printStackTrace();
}

Важно отметить, что это не будет работать в Java 10, так как у него будут более строгие правила использования setAccessible

0 голосов
/ 04 сентября 2015

TitledBorder использует JLabel для рисования текста на границе. К сожалению, JLabel является частной областью. Добавить значок можно двумя способами:

  • получить доступ к закрытому полю JLabel и установить значок на JLabel.

  • создайте подкласс TitledBorder и повторно реализуйте метод paintBorder. Я бы
    вероятно, также добавьте конструктор, который принимает JLabel, чтобы можно было
    контролировать, что нарисовано на границе.

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