2014-01-28 1 views
0

Чтобы сэкономить некоторое время при настройке размера компонентов Swing (JPanel, JLabel и т. Д.), Я пытаюсь написать метод, который при вызове будет устанавливать этот компонент с использованием 3 стандартных функций определения размера.Создание метода обработки всех типов компонентов Swing

Я хотел бы быть в состоянии сделать это:

import CustomComponents; 
... 
JPanel xPanel = new JPanel(); 
CSize.setDefiniteSize(xPanel, 400, 300); 
... 

и (или предпочтительно)

... 
JPanel xPanel = new JPanel(); 
xPanel.CSize.setDefiniteSize(400, 300); 
... 

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

package CustomComponents; 
import javax.swing.JComponent; 
import java.awt.Dimension; 

public class CSize 
{ 
public static void setDefiniteSize(JComponent c, int h, int w) 
{ 
    Dimension k = new Dimension (h, w); 
    c.setMaximumSize(k); 
    c.setMinimumSize(k); 
    c.setPreferredSize(k); 
} 
} 

Как вы можете видеть, здесь я попытался с помощью JComponent, но это не будет работать, так как все, что я использую его - сказать JPanel - это JPanel, а не JComponent (хотя это подкласс? Я все еще не понимаю, как это работает)

+0

Можете ли вы разместить точную ошибку/исключение? – sanbhat

+0

метод setDefiniteSize в классе CustomComponents.CSize не может применяться к заданным типам; требуется: javax.swing.JComponent, init, init; найдено: javax.swing.JFrame.int, int; Причина: фактический аргумент javax.swing.JFrame не может быть преобразован в javax.swing.JComponent путем преобразования вызова метода –

+0

'JFrame' _is not_ a' JComponent'. –

ответ

0

Вы должны использовать java.awt.Container, потому что JFrame не является прямым подклассом JComponent!

Так он должен работать со следующим кодом:

package CustomComponents; 

import java.awt.Container; 
import java.awt.Dimension; 

public class CSize { 
    public static void setDefiniteSize(Container c, int h, int w) { 
     Dimension k = new Dimension (h, w); 
     c.setMaximumSize(k); 
     c.setMinimumSize(k); 
     c.setPreferredSize(k); 
    } 
} 

Посмотрите на иерархии компонентов:

java.awt.Component 
    |--java.awt.Container 
     |--java.awt.Window 
     | |--java.awt.Frame 
     |   |--javax.swing.JFrame 
     |--javax.swing.JComponent 
      |--javax.swing.JLabel 

Еще лучше было бы использовать java.awt.Component, так как этот класс, определяющий все методы, которые вы хочется использовать (setMinimumSize, setMaximumSize и setPreferredSize).

+1

Подробнее [здесь] (http://stackoverflow.com/q/7229226/230513) о том, почему 'set * Size' является плохим. – trashgod

+1

Спасибо за это объяснение!Я не думал за пределами коробки, поэтому я только хотел объяснить, как компоненты соответствуют их иерархии. Но это хороший момент, чтобы упомянуть! – bobbel

2

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

Смотрите эту тему Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

Вместо этого вы должны использовать LayoutManagers. и .pack() рама. Swing был использован для использования с LayoutManager. Вы должны учесть, что ваша программа может выглядеть хорошо на вашем экране разработки, но может отличаться от других. Вы также узнаете, что многие LayoutManegers не будут даже уважать ваш предпочтительный размер, поэтому вам нужно узнать, какие из них и какие нет. Вот simple example

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

См. Laying out Components Within a Container для получения более подробной информации о способах их использования.

+0

@Scott: макеты - правильный выбор; не делайте этого [http://stackoverflow.com/a/12532237/230513). – trashgod