2013-06-09 1 views
2

У меня есть графический интерфейс, из этого графического интерфейса я выбираю входной файл с размерами системы бронирования (новый графический интерфейс). Если на плоскости есть 100 мест, GUI будет, например, 10x10, если самолет имеет 200 мест, он будет 10x20, все сиденья будут пуговицами и должны хранить информацию о них на них, если они забронированы. Также забронированное место не будет забронировано повторно.Создание графического интерфейса с циклом с использованием Java Swing

Вопрос в том, что размеры графического интерфейса будут меняться в соответствии с номерами сидений и ориентацией, что означает, что в одной версии может быть много кнопок на другом, а также больше мест означает, что графический интерфейс будет длиннее или шире, может быть, 10 см x 10 см или 10 см х 20 см, или 15 см х 25 см ...

Я собираюсь сделать это с помощью цикла for, но я не хочу выкладывать кнопки из GUI. Я не знаю, как я могу добавить кнопку рядом с другой кнопкой произвольно. Я всегда использовал Eclipse Window Builder для создания графических интерфейсов, но, я думаю, мне нужно написать это самостоятельно ... может кто-то мне помочь? Некоторые подсказки? Спасибо за ваше время!

+0

использование JToggleButton для системы резервирования – mKorbel

ответ

2

Try что-то вроде этого:

// The size of the window. 
Rectangle bounds = this.getBounds(); 

// How many rows of buttons. 
int numOfRows = 100; 

// How many buttons per row. 
int numOfColumns = 50; 

int buttonWidth = bounds.width/numOfRows; 
int buttonHeight = bounds.height/numOfColumns; 

int x = 0; 
int y = 0; 

for(int i = 0; i < numOfColumns; i++){ 
    for(int j = 0; j < numOfRows; j++){ 
     // Make a button 
     button.setBounds(x, y, buttonWidth, buttonHeight); 
     y += buttonHeight; 
    } 
    x += buttonWidth; 
} 

Это сделает все кнопки подходящими внутри вашего окна.

Вот ссылка на прямоугольники, они очень удобны при выполнении таких вещей. http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fgraphics%2FRectangle.html

Кроме того, вы все равно можете использовать windowbuilder, infact, который я рекомендую вам сделать. Это действительно помогает вам визуализировать нужные размеры. И вы также можете создать материал (кнопки, списки, выпадающие списки ... и т. Д.) Вручную с кодом и, предположив, что вы поместили переменные, в которых WindowBuilder, он все равно отобразит их на вкладке «дизайн».

Надеюсь, это поможет!

EDIT: Я был своего рода смутное о том, как сделать кнопки с помощью петли

Для того, чтобы кнопки с петлей вы будете нуждаться в буфер (для хранения временной кнопку достаточно долго, чтобы добавить в список) и .. . список: D.

Вот как это должно выглядеть:

Вне цикла:

// The list to store your buttons in. 
ArrayList<Button> buttons = new ArrayList<Button>(); 

// The empty button to use as a buffer. 
Button button; 

Внутри цикла (где '// Сделать кнопку' комментарий):

button = new Button(this, SWT.NONE); 
buttons.add(button); 

Теперь вы имеют список всех кнопок и могут легко обращаться к ним и вносить изменения, такие как изменение текста кнопок;

buttons.get(indexOfButton).setText("SomeText"); 

EDIT:

Видя, как вы новичок в SWT (и я не мог получить AWT/JFrame работать) вот полный код.

import org.eclipse.swt.SWT; 
import org.eclipse.swt.graphics.Rectangle; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

public class ButtonTest extends Shell { 

    /** 
    * Launch the application. 
    * @param args 
    */ 

    // Code starts here in main. 
    public static void main(String args[]) { 
     try { 
      Display display = Display.getDefault(); 
      // Creates a window (shell) called "shell" 
      ButtonTest shell = new ButtonTest(display); 
      // These two lines start the shell. 
      shell.open(); 
      shell.layout(); 

      // Now we can start adding stuff to our shell. 

      // The size of the window. 
      Rectangle bounds = shell.getBounds(); 

      // How many rows of buttons. 
      int numOfRows = 5; 

      // How many buttons per row. 
      int numOfColumns = 3; 

      int buttonWidth = bounds.width/numOfRows; 
      int buttonHeight = bounds.height/numOfColumns; 

     Button button; 

     int x = 0; 
     int y = 0; 

     for(int i = 0; i < numOfColumns; i++){ 
      for(int j = 0; j < numOfRows; j++){ 
       button = new Button(shell, SWT.NONE); 
       button.setBounds(x, y, buttonWidth, buttonHeight); 
       x += buttonWidth; 
      } 
      x = 0; 
      y += buttonHeight; 
     } 



     // This loop keeps the shell from killing itself the moment it's opened 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Create the shell. 
* @param display 
*/ 
public ButtonTest(Display display) { 
    super(display, SWT.SHELL_TRIM); 
    createContents(); 
} 

/** 
* Create contents of the shell. 
*/ 
protected void createContents() { 
    setText("SWT Application"); 
    setSize(800, 800); 

} 

@Override 
protected void checkSubclass() { 
    // Disable the check that prevents subclassing of SWT components 
} 

Кроме того, я сделал немного опечатку в моем вложенном цикле (и забыл сбросить й значение 0 после каждой строки). Это исправлено в этом редактировании.

Также вам нужно будет импортировать swt для этого. Перейдите сюда: http://www.eclipse.org/swt/ и загрузите последнюю версию своей операционной системы, затем зайдите в затмение, щелкните правой кнопкой мыши свой проект> Путь сборки> Настроить путь сборки> вкладка «Библиотеки»> Добавить внешний JAR> найдите загруженный файл swt и нажмите.

Извините за такой длинный ответ, надеюсь, что это помогает: D

+0

Да Window Builder является отличный плагин и помогает мне визуализировать вещи, но в Window Builder я положил все кнопки вручную самостоятельно, скажем, 20 кнопок, которые я ставил себе ... но я не могу сделать это всегда ... его нужно автоматизировать, как цикл, который вы дали, я тоже думал о чем-то подобном, спасибо, я все еще пытаюсь и собираюсь обновить :) – Anarkie

+0

http://pastecode.org/index.php/view/13730698 Это то, что я мог придумать, возможно, я делаю что-то не так с границами, а в Главном вызове GUI ошибочно:/ – Anarkie

+1

AHA, изменить «public class» GUI_Rec {"to" public class GUI_Rec расширяет JFrame {. Это исправляет проблему с вызовом GUI. (Я думаю, что еще есть что исправить, см. Лемму) – Austin

1

Начать с GridLayout. Каждый раз, когда вам нужно изменить расположение сиденья, повторно примените GridLayout.

То есть, если вам нужно 100 мест, использовать что-то вроде, новый GridLayout(20, 10) ...

Лично я хотел бы использовать GridBagLayout, но это может быть комплекс для выполнения этой задачи под рукой

Its немного сложнее добавить/rmove новый контент. Я бы лично перестроил интерфейс и повторно применил модель к ней.

Что касается размера, вы можете не иметь большого контроля над ним, поскольку он будет отображаться по-разному на разных экранах. Вместо этого вы должны предоставить средства, с помощью которых вы можете запретить пользовательскому интерфейсу изменять размер экрана.

Это можно сделать, разместив сиденье в пределах JScrollPane. Это позволит посиделка панели расширяться и сжиматься в размерах без него потенциально более размеров на экране

Взгляните на