Размещение JLabel в определенной координате x,y на JPanel

Я пытаюсь разместить ряд JLabels в определенных координатах X и Y на JPanel (и установить его высоту и ширину). Что бы я ни делал, каждая этикетка оказывается справа от предыдущей и имеет точно такой же размер, как и все остальные.

прямо сейчас моя Jpanel находится в макете сетки. Я пробовал абсолютный макет (результаты исключения незаконных аргументов), бесплатный дизайн (не появляются метки), макет потока (все просто сжимается до центра) и несколько другие.

Не уверен, что мне нужно сделать, чтобы сделать эту работу. Кто-нибудь может помочь? Спасибо!

JLabel lbl1 = new JLabel("label 1");
JLabel lbl2 = new JLabel("label 2");
JLabel lbl3 = new JLabel("label 3");
JLabel lbl4 = new JLabel("label 4");
JLabel lbl5 = new JLabel("label 5");

myPanel.add(lbl1);
myPanel.add(lbl2);
myPanel.add(lbl3);
myPanel.add(lbl4);
myPanel.add(lbl5);

lbl1.setLocation(27, 20);
lbl2.setLocation(123, 20);
lbl3.setLocation(273, 20);
lbl4.setLocation(363, 20);
lbl5.setLocation(453, 20);

lbl1.setSize(86, 14);
lbl2.setSize(140, 14);
lbl3.setSize(80, 14);
lbl4.setSize(80, 14);
lbl5.setSize(130, 14);

6 ответов


вы должны установить макет вашего контейнера в null:

myPanel.setLayout(null);

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


  1. установите диспетчер компоновки контейнера в значение null, вызвав setLayout(null).

  2. вызовите класс компонента setbounds метод для каждого из дочерних элементов контейнера.

  3. вызовите метод repaint класса компонента.

Примечание:

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

передать этот ссылка на сайт: http://docs.oracle.com/javase/tutorial/uiswing/layout/none.html


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

myPanel = new JPanel(null);

или

myPanel.setLayout(null);

мой совет-использовать IDE, как NetBeans С его редактором GUI. Для проверки кода и потому есть много способов:

настройка менеджера макетов или для абсолютного позиционирования делает myPanel.setLayout (null), имеет несколько влияний.

В общем случае, предполагая, что вы выполняете свои вызовы в конструкторе JFrame, вы можете вызвать pack() для начала разметки.

тогда каждый менеджер макетов использует свою собственную реализацию add(Component) или add(Component, Constraint). Использование BorderLayout с add (label, BorderLayout.Центр) и так далее.


    // Best solution!!

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {

  public static void main(String args[]) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel = (JPanel) frame.getContentPane();
    panel.setLayout(null);

    JLabel label = new JLabel("aaa");
    panel.add(label);
    Dimension size = label.getPreferredSize();
    label.setBounds(100, 100, size.width, size.height);

    frame.setSize(300, 200);
    frame.setVisible(true);

  }
}

вы можете использовать свой собственный метод, вызывающий значения setSize, setLocation для напрямую....! ` Также я покажу вам, как использовать Jprogress Bar

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

class installComp{
    void install(Component comp, int w, int h, int x, int y){
        comp.setSize(w,h);
        comp.setLocation(x,y);
    }
}
class MyFrame extends JFrame{
    int cur_val = 0;
    JButton btn = new JButton("Mouse Over");
    JProgressBar progress = new JProgressBar(0,100);
    MyFrame (){
        installComp comp=new installComp();

        comp.install(btn,150,30,175,20);
        comp.install(progress,400,20,50,70);

        btn.addMouseListener(new MouseAdapter(){
            public void mouseEntered(MouseEvent evt){
                cur_val+=2;
                progress.setValue(cur_val);
                progress.setStringPainted(true);
                progress.setString(null);
            }
        }); 
        add(btn);
        add(progress);
        setLayout(null);    
        setSize(500,150); 
        setResizable(false);
        setDefaultCloseOperation(3);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
class Demo{
    public static void main(String args[]){
        MyFrame f1=new MyFrame();   
    }
}