2014-01-03 2 views
0

Я пытаюсь изменить размер кнопки, но когда я устанавливаю ширину, высота автоматически изменяется, даже если высота имеет собственное значение. Как изменить только ширину (или высоту)? Мне нужно это для моих кнопок «reset» и «calc». кода (без ненужного другого кода)Изменить размер кнопки FlowLayout

class Wind extends JButton { 
//declaration of variables 
@Override 
public Dimension getPreferredSize() { 
    Dimension d = super.getPreferredSize(); 
    int s = (int) (d.getWidth() < d.getHeight() ? d.getHeight() : d.getWidth()); 
    return new Dimension(s, s); 
} 
public static void main(final String[] args) { 
    Runnable r = new Runnable() { 

     @Override 
     public void run() { 

      JComponent gui = new JPanel(new FlowLayout()); 

      for (int ii = 1; ii < 20; ii++) { 
       final JButton button = new Wind(""); 

       gui.add(button); 
       button.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
        } 

       }); 

      } 

      gui.setBorder(new EmptyBorder(4, 3, 4, 8)); 
      final JButton reset = new Wind("Reset"); 
      Dimension dim = new Dimension(40,80); 

      reset.setPreferredSize(dim); 

      gui.add(reset); 

      reset.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 

       } 

      }); 

      JFrame f = new JFrame("Name of my frame"); 
      f.add(gui); 

      final JButton cal = new Wind("Calc"); 

      gui.add(cal); 
      cal.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { } 
      }); 

      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      f.setLocationByPlatform(true); 
      f.pack(); 
      f.setVisible(true); 
      f.setSize(350, 450); 
      f.setResizable(false); 
     } 
    }; 
    SwingUtilities.invokeLater(r); 
} 

}

+1

Почему ваш 'JButton'' новое окно'? –

+1

Это вне контекста. Опубликовать полный рабочий/рабочий код. – Yoda

ответ

1

Из-за вашего метода getPreferredSize() -

// sets s to the least of height and width. 
int s = (int) (d.getWidth() < d.getHeight() ? d.getHeight() : d.getWidth()); 
return new Dimension(s, s); // <-- sets height and width the same. 

Я думаю, что вы хотите использовать (в зависимости от цели) -

if (d.getWidth() < d.getHeight()) { 
    return new Dimension(d.getWidth(), d.getHeight()); 
} 
return new Dimension(d.getHeight(), d.getWidth()); 
2

Ну, из того, что я вижу, вы вынуждаете ширину и вес ХТ ваших Wind случаев иметь такое же значение:

@Override 
public Dimension getPreferredSize() { 
    Dimension d = super.getPreferredSize(); 
    int s = (int) (d.getWidth() < d.getHeight() ? d.getHeight() : d.getWidth()); 
    return new Dimension(s, s); 
} 

Wind#getPreferredSize возвращает Dimension экземпляра, который содержит как ширину и высоту, что ваш Wind экземпляра хочет иметь. В вашем случае он возвращает новый экземпляр Dimension, состоящий из двух одинаковых значений: s, который является самым большим из ширины и высоты, установленным через Wind#setPreferredSize. Вы, вероятно, хотите сделать как @Elliott Фриш просто предложил :)

Кстати, вы также делаете к концу:

frame.pack() 
... 
frame.setSize(...); 

На мой взгляд, вы должны сделать что-либо один или другой, но нет смысла называть оба метода :)

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