2013-07-22 3 views
2

Итак, мой JFrame не получается так, как я этого хочу, из-за FlowLayout(), но я не знаю, что еще использовать, чтобы исправить это. Это просто делает мой JButton заполнить весь JFrame. Есть ли способ получить FlowLayout() для применения моих пользовательских размеров и местоположения для компонентов JFrame, или есть альтернатива, которая могла бы легко заменить его?Что следует использовать вместо FlowLayout()?

Вот мой код:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MTGSAMPServerReference extends JFrame implements ActionListener { 

    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth()); 
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight()); 

    private static final long serialVersionUID = 1L; 
    private static JList list1; 
    private static JButton next; 

    public MTGSAMPServerReference() { 
     // set flow layout for the frame 
     this.getContentPane().setLayout(new FlowLayout()); 
     Object[] data1 = { "Value 1", "Value 2", "Value 3", "Value 4", "Value 5" }; 
     list1 = new JList<Object>(data1); 
     next = new JButton("Next"); 
     next.addActionListener(this); 
     // add list to frame 
     add(list1); 
     add(next); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getActionCommand().equals("Next")) { 
      int index = list1.getSelectedIndex(); 
      System.out.println("Index Selected: " + index); 
      String s = (String) list1.getSelectedValue(); 
      System.out.println("Value Selected: " + s); 
     } 
    } 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame f = new MTGSAMPServerReference(); 
     //Display the window. 
     f.pack(); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.setSize(1200, 800); 
     f.setLocationRelativeTo(null); 
     list1.setSize(250, 250); 
     list1.setLocation(0, 0); 
     next.setSize(75, 25); 
     next.setLocation(251, 276); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     createAndShowGUI(); 
     } 
     }); 
    } 
} 

Любые идеи?

Заранее благодарен!

EDIT: Вот изображение проблемы.

This is the problem.

EDIT: Вот что я хочу, чтобы выглядеть (примерно):

This is about what it should look like.

+0

* "Это только делает мой JButton заполнить всю JFrame" * Не здесь нет. Предоставьте ASCII-графику графического интерфейса, поскольку он должен отображаться в наименьшем размере и (если размер изменяется) с дополнительной шириной/высотой. Кроме того, пожалуйста, укажите импорт в верхней части исходного кода и исправьте все предупреждения компилятора перед публикацией. У меня есть версия вашего кода, которая делает это. Вы хотите, чтобы я отредактировал его в вопросе? –

+0

Или просто разместите изображение или ссылку на него. – tbodt

+0

@AndrewThompson Что теперь? Должен ли я просто сделать снимок экрана о том, как он выглядит? – knorberg

ответ

3

Этот пример помещает кнопку под списком и добавляет границу в список с помощью панели прокрутки. «Белое пространство» в графическом интерфейсе обеспечивается частично за счет интервала, определенного в конструкторе макета (например, пробел между списком и кнопкой), а частично - с помощью EmptyBorder.

Панель управления (которая использует BorderLayout) затем помещается внутри другого FlowLayout.

GUI

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class MTGSAMPServerReference extends JFrame implements ActionListener { 

    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth()); 
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight()); 

    private static final long serialVersionUID = 1L; 
    private static JList list1; 
    private static JButton next; 

    public MTGSAMPServerReference() { 
     // set flow layout for the frame 
     this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING)); 
     Object[] data1 = { "Value 1", "Value 2", "Value 3", "Value 4", "Value 5" }; 

     JPanel controls = new JPanel(new BorderLayout(5,5)); 

     list1 = new JList<Object>(data1); 
     list1.setVisibleRowCount(5); 
     next = new JButton("Next"); 
     next.addActionListener(this); 
     // add list to frame 
     controls.add(new JScrollPane(list1)); 
     controls.add(next, BorderLayout.PAGE_END); 
     // adjust numbers as needed. 
     controls.setBorder(new EmptyBorder(25,25,0,0)); 

     add(controls); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (e.getActionCommand().equals("Next")) { 
      int index = list1.getSelectedIndex(); 
      System.out.println("Index Selected: " + index); 
      String s = (String) list1.getSelectedValue(); 
      System.out.println("Value Selected: " + s); 
     } 
    } 

    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame f = new MTGSAMPServerReference(); 
     //Display the window. 
     f.pack(); 
     f.setVisible(true); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     f.setSize(1200, 800); 
     f.setLocationRelativeTo(null); 
     list1.setSize(250, 250); 
     list1.setLocation(0, 0); 
     next.setSize(75, 25); 
     next.setLocation(251, 276); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     createAndShowGUI(); 
     } 
     }); 
    } 
} 
+0

Итак, это позволяет настроить «FlowLayout()», правильно? Я вижу, что он может перемещать компоненты/ – knorberg

+2

Запустите его, затем играйте с номерами в конструкторах 'BorderLayout' и' EmptyBorder'. ... затем прочитайте JavaDocs для каждого конструктора. –

+0

Спасибо большое! Это должно работать удивительно! – knorberg

-2

Если вы хотите полный контроль над тем, где компоненты размещены, и имеют setBounds работу, вам нужно удалить диспетчер компоновки. Это можно сделать, установив диспетчер компоновки на null. Однако это не очень хорошая идея, и вам лучше всего использовать диспетчер компоновки, а не использовать setBounds вообще, потому что вы не привязаны к конкретным размерам окна и размерам компонентов по умолчанию, а также к компонентам, которые выглядят хорошо с определенным размером на одном взгляде и чувстве может не выглядеть красиво на другом.

+0

Я хочу полный контроль, но не хочу делать ничего, что не является хорошей практикой. Я учусь и хочу знать лучший способ сделать это. – knorberg

+0

Эти два требования противоречат друг другу. При запуске следует использовать диспетчер компоновки. Гарантируется, что ваши компоненты будут красиво размещены. – tbodt

+3

Автоматический -1 для упоминания 'setBounds'. Это касается только экспертов и даже тогда, только в крайне редких случаях. –

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