2013-07-05 2 views
0

У меня есть две кнопки, одна из которых называется btnShort и одна из них - btnLong. Я бы хотел, чтобы они были одинаковой ширины, так что будет лучшим вариантом?Как я могу создать 2 экземпляра JButton с одинаковой шириной

enter image description here

import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class TestCode2 { 

public static void main(String[] args) { 

    JFrame window = new JFrame("Test2"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setSize(400, 200); 

    // --------------------------------------------------------------------- 

    GridBagLayout layout = new GridBagLayout(); 
    GridBagConstraints constraints = new GridBagConstraints(); 

    JPanel container = new JPanel(layout); 
    window.add(container); 

    constraints.gridy = 0; 

    JButton btnShort = new JButton("Short"); 
    layout.setConstraints(btnShort, constraints); 
    container.add(btnShort); 

    constraints.gridy = 1; 

    JButton btnLong = new JButton("That's a long button"); 
    layout.setConstraints(btnLong, constraints); 
    container.add(btnLong); 

    //This one won't work because button dimension is not known yet... 
    //btnShort.setPreferredSize(new Dimension(btnLong.getWidth(), btnLong.getHeight())); 

    // --------------------------------------------------------------------- 

    window.setVisible(true); 
} 

} 

ответ

1

использования сделать из соответствующего менеджера компоновки, как GridBagLayout и это ограничение ...

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Buttons { 

    public static void main(String[] args) { 
     new Buttons(); 
    } 

    public Buttons() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridwidth = GridBagConstraints.REMAINDER; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 

      add(new JButton("I'm a very long button"), gbc); 
      add(new JButton("I'm not"), gbc); 

     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 
    }  
} 
+0

Ну, это сложно. Я не вижу причины вызова нового метода «Run()» - он работает без, но я не понимаю, почему кнопки выглядят по-другому в этом случае !!! –

+0

Причина для invokeLater объясняется в [Inital Threads] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). Если вы установите ограничение weightX, это изменит размер всех компонентов для столбца, чтобы занять заданное пространство. Этот пример просто использует ограничение заполнения HORIZONTAL, чтобы запросить, чтобы все компоненты в столбце заполнили столбец – MadProgrammer

+0

Извините, но я все еще не получаю ** почему ** вы использовали 'invokeLater()'? Как я уже сказал, все работает нормально, но имеет другой аспект (другое, что я не понимаю) –

3

Установите GridBagConstraints заливки свойство GridBagConstraints.HORIZONTAL так, что обе JButton компонентов занимают одинаковую ширину в контейнере

constraints.fill = GridBagConstraints.HORIZONTAL; 
+0

+1 Got в первом – MadProgrammer

+0

Спасибо за ответ, но это не очень приятно, как самая длинная кнопка будет иметь это размер тоже изменилась - моя цель была лишь изменить ширину короткой. –

+0

В этом случае вам придется дополнительно переопределить getPreferredSize для длинной кнопки, чтобы получить нужный размер. См. Обновление – Reimeus