2015-05-09 2 views
1

Привет там я работаю над приложением Java и ниже приводится выдержка из пользовательского класса под названием Гуй, который простирается JFrame:BoxLayout не может быть общей ошибкой?

public Gui(){ 
    super("EVC Scan & Price"); 
    setSize(400,500); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(false); 
    // GridLayout layout = new GridLayout(5,1); 
    BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); 
    setLayout(layout); 

    //add header row 
    headerRow.setAlignmentX(Component.CENTER_ALIGNMENT); 
    BorderLayout layoutHeading = new BorderLayout(); 
    headerRow.setLayout(layoutHeading); 
    if (headerImg != null){ 
    ImageIcon icon = new ImageIcon(headerImg); 
    picLabel.setIcon(icon);} 
    headerRow.add(picLabel, BorderLayout.NORTH); 
    title.setAlignmentX(JLabel.CENTER_ALIGNMENT); 
    headerRow.add(title, BorderLayout.SOUTH); 
    add(headerRow); 

    //add first row 
    firstRow.setAlignmentX(Component.LEFT_ALIGNMENT); 
    BoxLayout layoutRow1 = new BoxLayout(firstRow,BoxLayout.Y_AXIS); 
    firstRow.setLayout(layoutRow1); 
    firstRow.add(catLabel); 
    scroll.setSize(390,100); 
    firstRow.add(scroll); 
    add(firstRow); 

    setVisible(true); 
} 

Я прочитал много учебников и API, и на самом деле не вижу ничего плохого в этом , однако строка: add (headerRow); похоже, является триггером ошибки «BoxLayout не может быть общим». Если я изменил макет для JFrame на flowlayout, вложенная boxlayout, примененная к секции firstRow, отлично работает?

Помогите пожалуйста?

ответ

3

Изменить это:

BoxLayout layout = new BoxLayout(this, BoxLayout.Y_AXIS); 

к этому:

BoxLayout layout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS); 

Ошибка продуцирующих код передает JFrame в конструктор BoxLayout в качестве BoxLayout с использованием контейнера, когда на самом деле это не так. По правде говоря, вы добавляете макет в контентную панель JFrame, а не в JFrame.

В качестве альтернативы вы можете рисовать себя в углу, предлагая вашему классу расширение JFrame, заставляя вас создавать и отображать JFrames, когда требуется больше гибкости. На самом деле, я бы рискнул, что большая часть кода GUI Swing, который я создал, и что я видел, не расширяет JFrame, и на самом деле редко вы когда-нибудь захотите это сделать. Чаще всего ваши классы GUI будут ориентированы на создание JPanels, которые затем могут быть помещены в JFrames или JDialogs или JTabbedPanes или заменены через CardLayouts, где это необходимо. Это значительно повысит гибкость вашего графического интерфейса.