2015-09-04 2 views
-1

Я попытался setLocation (x, y) и setLocationRelativeTo (null), установив Layout из JFrame как null, но это не сработало. Во время поиска я нашел, что этот вопрос уже задан два или три человека, но они сделали через setLocation() и setLocationRelativeTo (null).Как вручную установить местоположения JComponents и т. Д.

import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import java.awt.FlowLayout; 

public class StartMenu{ 
    JPanel startPanel; 
    JLabel title; 
    JButton startTest; 
    JButton exit; 
    JFrame menuFrame; 

    public StartMenu(){ 
     menuFrame = new JFrame("Start Menu"); 
     menuFrame.setLayout(null); 

     startPanel = new JPanel(); 

     title = new JLabel("Adaptive Test",JLabel.CENTER); 
     title.setLocation(20,20); 
     startPanel.add(title); 

     startTest = new JButton("Start"); 
     startTest.setLocation(40,40); 
     startPanel.add(startTest); 

     exit = new JButton("Exit"); 
     exit.setLocation(100,100); 
     startPanel.add(exit); 
     menuFrame.setContentPane(startPanel); 

     menuFrame.setVisible(true); 
     menuFrame.setSize(500, 500); 
     menuFrame.setResizable(false); 
     menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+2

Java GUI должны работать с различными ОС, размером экрана, разрешением экрана и т. Д., Используя различные PLAF в разных локалях. Таким образом, они не способствуют идеальной компоновке пикселей. Вместо этого используйте диспетчеры макетов или [их комбинации] (http://stackoverflow.com/a/5630271/418556), а также макет и границы для [пробела] (http://stackoverflow.com/a/17874718/ 418556). –

+2

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

+1

Ваш 'startPanel' по-прежнему имеет формат FlowLayout по умолчанию. Измените только макет startPanel на null (а не на фрейм) и используйте 'setBounds()' ... Это применимо только в том случае, если вы действительно хотите нулевой макет, конечно (по причинам обучения или тому подобное). - Если это не необходимо, используйте [менеджеры макетов] (https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html). –

ответ

0

Ваш JFrame 'раскладка сек устанавливается в нуль, но startPanel' s один не является. Итак, прежде всего, использование:

startPanel.setLayout(null); 

Теперь вместо component.setLocation(x, y), используйте component.setBounds(x, y, width, height), так что вы также установить размер для них.

Но, как было сказано в комментариях, было бы предпочтительнее использовать layout managers вместо нулевого макета.

-1

Сначала Вы настраиваете обнулить JFrame istead в JPanel, так что вы должны использовать

startPanel.setLayout(null); 

, то вы должны использовать SetBounds istead из setLocation becouse если вы просто установить местоположение с нулевым менеджером размещения вами» Вероятно, вы ничего не увидите на своей панели, потому что все размеры инициализируются до 0 по умолчанию.

так, вы можете переписать программное обеспечение, как это:

import javax.swing.JFrame; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class StartMenu{ 
    JPanel startPanel; 
    JLabel title; 
    JButton startTest; 
    JButton exit; 
    JFrame menuFrame; 

    public StartMenu(){ 
     menuFrame = new JFrame("Start Menu"); 
     menuFrame.setLayout(null); 

     startPanel = new JPanel(); 
     startPanel.setLayout(null); 

     title = new JLabel("Adaptive Test",JLabel.CENTER); 
     title.setBounds(20,20, 100, 30); 
     startPanel.add(title); 

     startTest = new JButton("Start"); 
     startTest.setBounds(50,50, 100, 30); 
     startPanel.add(startTest); 

     exit = new JButton("Exit"); 
     exit.setBounds(100,100, 100 ,30); 
     startPanel.add(exit); 
     menuFrame.setContentPane(startPanel); 

     menuFrame.setVisible(true); 
     menuFrame.setSize(500, 500); 
     menuFrame.setResizable(false); 
     menuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 

} 

как это вы получите что-то работает, но это не очень хорошая практика программирования, чтобы установить вручную все расположение и размеры в вашем программном обеспечении becouse он не будет работать хорошо на разных системах (таким образом, он не будет переносимым), и вы также окажетесь в отладочном кошмаре, когда ваше программное обеспечение начнет расти с десятками, если не сотнями графических элементов.

Мое предложение - использовать gridBagLayout, сначала мне кажется неясным, но поверьте мне, это не так!