2013-11-19 4 views
1

У меня такая странная проблема, и похоже, что это не происходит в системах Mac, но в Windows. Я работаю над этим графическим интерфейсом и пытаюсь сделать все кнопки одинаковой длины (длина самой длинной кнопки), но по какой-то причине в Windows одна из кнопок не отображает всю строку и обрезает ее с помощью эллипсис (...).Java/JButton: Как избавиться от эллипсов на JButton?

Вот метод я использую, чтобы проверить и установить самую длинную кнопку метки:

//Temp button to hold the longest button for resizing 
    JButton longestButton = new JButton(); 

    //Find size of the largest of the 6 buttons 
    for(int i = 0; i < 6; i++){ 
     if (buttons[i].getText().length() > longestButton.getText().length()){ 
      longestButton = buttons[i]; 
     } 
    } 

    //Match size of 6 hex buttons to the size of the longest one 
    for(int i = 0; i < 6; i++){ 
     buttons[i].setPreferredSize(longestButton.getPreferredSize()); 
    } 

кто-нибудь есть некоторое понимание этого?

+1

'кнопка [я] .getText(). Длина()' не будет давать относительные длины оказанному текста, если вы не используете моноширинный шрифт. Вы должны принять во внимание фактический используемый шрифт – vandale

+0

Я не уверен, как это сделать или реализовать его, чтобы изменить размеры кнопок. – wsc

+0

Вы можете попытаться использовать определение своего менеджера макетов, в котором каждый компонент будет основываться на максимальной предпочтительной ширине ... – MadProgrammer

ответ

3

Не используйте setPreferredSize(), когда вы на самом деле означает переопределить getPreferredSize(). BoxLayout хорошо подходит для этого: «Для макета сверху вниз предпочтительная ширина контейнера - это максимальная предпочтительная ширина детей». В приведенном ниже примере BorderLayout.LINE_END принимает предпочтительную ширину контейнера. Каждая кнопка переопределяет getMaximumSize(), чтобы эффективно удалить верхний предел по ширине кнопки. Результат хорошо работает на разных платформах.

image

import java.awt.*; 
import javax.swing.*; 

/** 
* @see https://stackoverflow.com/a/20085489/230513 
*/ 
public class TestViewer { 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new ButtonPanel(), BorderLayout.LINE_END); 
       frame.pack(); 
       frame.setSize(500, 300); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    private static class ButtonPanel extends Box { 

     public ButtonPanel() { 
      super(BoxLayout.Y_AXIS); 
      this.add(createButton("Button 1")); 
      this.add(createButton("Button 2")); 
      this.add(createButton("Long Button 3")); 
      this.add(createButton("Button 4")); 
      this.add(createButton("Button 5")); 
     } 

     private JButton createButton(String name) { 
      final JButton b = new JButton(name) { 

       @Override 
       public Dimension getMaximumSize() { 
        return new Dimension(
         Short.MAX_VALUE, getPreferredSize().height); 
       } 
      }; 
      b.setAlignmentX(0.5f); 
      return b; 
     } 
    } 
} 
+0

Могу ли я использовать это совместно с GridBagLayout? Я на самом деле работаю над старым кодом, использующим этот макет. – wsc

+0

Извините, я никогда не пробовал; «GridBagLayout'» использует предпочтительные размеры компонентов, чтобы определить, насколько большими должны быть ячейки », поэтому стоит попробовать. – trashgod

0

Вместо поиска кнопки с наибольшей длиной .getText(). Length() вы можете найти кнопку с самым широким предпочтительнымSize().

for(int i = 0; i < 6; i++){ 
    if (buttons[i].getPreferredSize().getWidth() > longestButton.getPreferredSize().getWidth()){ 
     longestButton = buttons[i]; 
    } 
} 

Это устраняет проблему vandale упоминается в комментариях

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