2012-03-12 2 views

ответ

6

Рассмотрите возможность оставить заголовок с левой стороны ... но ... это приблизит вас к центру. Для изменяемых размеров кадров вам нужно переписать заголовок при изменении размера.

JFrame t = new JFrame(); 
t.setSize(600,300); 
t.setFont(new Font("System", Font.PLAIN, 14)); 
Font f = t.getFont(); 
FontMetrics fm = t.getFontMetrics(f); 
int x = fm.stringWidth("Hello Center"); 
int y = fm.stringWidth(" "); 
int z = t.getWidth()/2 - (x/2); 
int w = z/y; 
String pad =""; 
//for (int i=0; i!=w; i++) pad +=" "; 
pad = String.format("%"+w+"s", pad); 
t.setTitle(pad+"Hello Center"); 
+0

Спасибо! Это сработало! – wishman

+0

+1, я думаю, это правильный ответ, но для изменяемого размера я думаю, что он может написать один 'addWindowStateListener (...)', чтобы сделать эту работу :-) –

+1

EDIT заменил for-loop на String.format() – Java42

0

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

2
I have a JFrame with a Title. I want center align the title, so that 
it appears in the middle of the JFrame's title. 

просто не представляется возможным центрирование narrarive в JFrames TitleBar, этот контейнер пришел из Native OS

  • грязного хака возможны по инвентарю getSystemLookAndFeel в ОС Windows

  • создать неукрашенный JFrame путем добавления JPanel (имитируется Toolbar) с JButtons (JButtons с иконками, имитирующими кнопки стандартов)

4

Адаптирование answer's source из @ Java42, я сделал "обходной путь", чтобы настроить название при изменении размеров JFrame:

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 

import javax.swing.JFrame; 


public class JFrameTitleCenter { 

    public void createAndShowGUI() { 

     JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(300, 200)); 
     frame.setTitle("Hello Center"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.addComponentListener(new ComponentAdapter() { 
      @Override 
      public void componentResized(ComponentEvent e) { 
       titleAlign(frame); 
      } 

     }); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 

    private void titleAlign(JFrame frame) { 

     Font font = frame.getFont(); 

     String currentTitle = frame.getTitle().trim(); 
     FontMetrics fm = frame.getFontMetrics(font); 
     int frameWidth = frame.getWidth(); 
     int titleWidth = fm.stringWidth(currentTitle); 
     int spaceWidth = fm.stringWidth(" "); 
     int centerPos = (frameWidth/2) - (titleWidth/2); 
     int spaceCount = centerPos/spaceWidth; 
     String pad = ""; 
     pad = String.format("%" + (spaceCount - 14) + "s", pad); 
     frame.setTitle(pad + currentTitle); 

    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(() -> { 
      new JFrameTitleCenter().createAndShowGUI(); 
     }); 
    } 
} 

Working:

enter image description here

+1

Очень хороший брат. +1 hehe – Viana

+0

Отлично! Я обновил свой код с вашим обновлением :) 5 лет спустя ....;) – wishman

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

  • Нет связанных вопросов^_^